Tôi có một ListView
ở chế độ ảo và dữ liệu cơ bản đang được lưu trữ trong một List<MyRowObject>
. Mỗi cột của ListView
tương ứng với thuộc tính chuỗi công khai là MyRowObject
. Các cột của ListView
của tôi có thể được định cấu hình trong suốt thời gian chạy, vì vậy bất kỳ cột nào trong số chúng có thể bị vô hiệu hóa và chúng có thể được sắp xếp lại. Để trở về một ListViewItem
cho sự kiện RetrieveVirtualItem
, tôi có một phương pháp tương tự như:Có cách nào tốt đẹp để tránh sử dụng sự phản chiếu để điền vào ListView ảo của tôi không?
class MyRowObject
{
public string[] GetItems(List<PropertyInfo> properties)
{
string[] arr = new string[properties.Count];
foreach(PropertyInfo property in properties)
{
arr[i] = (string)property.GetValue(this,null);
}
return arr;
}
}
Việc xử lý sự kiện cho RetrieveVirtualItem
trông tương tự như:
private void listView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
e.Item = new ListViewItem(_virtualList[e.ItemIndex].GetItems(_currentColumns));
}
Có lẽ không đáng ngạc nhiên, điểm chuẩn cho thấy phương pháp này là đáng kể chậm hơn so với triển khai đã truy cập các thuộc tính trực tiếp theo thứ tự được mã hóa cứng và sự chậm lại chỉ đủ quan trọng để tôi muốn tìm một giải pháp tốt hơn.
Ý tưởng đầy hứa hẹn nhất mà tôi có là sử dụng một đại biểu ẩn danh để nói cho lớp MyRowObject
cách truy cập trực tiếp các thuộc tính, nhưng nếu có thể tôi không thể có được ngữ nghĩa ngay (được đặt tên của thuộc tính được lưu trữ trong một chuỗi, có cách nào tôi có thể viết một đóng cửa để truy cập trực tiếp tài sản đó?).
Vì vậy, có cách nào tốt đẹp để tránh sử dụng phản chiếu để điền ListView của tôi mà không làm mất bất kỳ chức năng nào không?
Phần mở rộng nguồn mở của ListView bị giới hạn do chính sách của công ty.
gì về chuyển đổi/trường hợp? –
Biểu thức (đặc biệt là trên .net 4) có thể là một cách dễ dàng để thực hiện một đại biểu nhanh chóng làm những gì bạn muốn. – CodesInChaos