Tôi đã có một tình huống mà tôi có một đối tượng kinh doanh với khoảng 15 thuộc tính của các loại khác nhau. Đối tượng kinh doanh cũng phải thực hiện một giao diện trong đó có các phương pháp sau đây:.NET: chuyển đổi so với từ điển cho các phím chuỗi
object GetFieldValue(string FieldName);
tôi có thể thấy 2 cách thực hiện phương pháp này:
Sử dụng một câu lệnh switch:
switch (FieldName)
{
case "Field1": return this.Field1;
case "Field2": return this.Field2;
// etc.
}
Dùng từ điển (SortedDictionary hoặc HashTable?):
return this.AllFields[FieldName];
Điều gì sẽ hiệu quả hơn?
Đã thêm: Quên để nói. Phương pháp này là để hiển thị mục trong lưới. Lưới sẽ có một cột cho mỗi thuộc tính này. Sẽ thường xuyên có lưới với hơn 1000 mục trong đó. Đó là lý do tại sao tôi quan tâm đến hiệu suất.
Added 2:
Dưới đây là một ý tưởng: một cách tiếp cận lai. Tạo một từ điển tĩnh với các khóa là các tên thuộc tính và các giá trị là các chỉ mục trong mảng. Từ điển chỉ được điền một lần, khi khởi động ứng dụng. Mỗi cá thể đối tượng có một mảng. Vì vậy, tra cứu sẽ như sau:
return this.ValueArray[StaticDictionary[FieldName]];
Thuật toán điền từ điển có thể sử dụng phản chiếu. Sau đó, các thuộc tính sẽ được triển khai cho phù hợp:
public bool Field1
{
get
{
object o = this.ValueArray[StaticDictionary["Field1"]];
return o == null ? false : (bool)o;
}
set
{
this.ValueArray[StaticDictionary["Field1"]] = value;
}
}
Ai có thể thấy bất kỳ vấn đề nào với điều này không?
Nó cũng có thể được thực hiện thêm một bước và ValueArray/StaticDictionary có thể được đặt trong một loại chung riêng biệt ValueCollection<T>
, trong đó T
sẽ chỉ định loại phản ánh. ValueCollection cũng sẽ xử lý trường hợp khi chưa có giá trị nào được đặt. Thuộc tính sau đó có thể được viết đơn giản như:
public bool Field1
{
get
{
return (bool)this.Values["Field1"];
}
set
{
this.Values["Field1"] = value;
}
}
Và cuối cùng, tôi bắt đầu tự hỏi một lần nữa, nếu một câu lệnh switch đơn giản có thể không được cả hai nhanh hơn và dễ dàng hơn để duy trì ....
Có lý do nào khiến bạn không ràng buộc toàn bộ đối tượng vào lưới dưới dạng datarow không? –
Để nói sự thật, đó là thingy DevExpress TreeList. Nó giống như một hybrid treeview/gridview. Vì vậy, dữ liệu phải được phân cấp. Và giao diện là có để TreeList hiểu được thứ bậc. Tôi có lẽ cũng có thể dịch nó tất cả để một DataTable (nó có thể ràng buộc với điều đó quá), nhưng điều này là thoải mái hơn cho tôi để làm việc với sau đó. –
Ý tôi là, tôi sẽ làm những thứ khác với cấu trúc dữ liệu này sau đó, không chỉ hiển thị nó trong lưới. –