2010-11-22 31 views
5

Biểu hiện của tôi không tuyệt vời và tôi muốn cải thiện chúng nên tôi tự hỏi nếu có ai đó có thể giải thích cho tôi nếu có thể tạo ra một tài sản trong một lớp có thể được nhận giá trị trong quá trình instantiation như sau:Biểu thức <Func <TModel, TProperty >> làm thuộc tính để khởi tạo đối tượng?

new Column<Product>{ ColumnProperty = p => p.Title}; 

hay vẫn tốt hơn (nhưng tôi nghĩ rằng tôi đang đẩy nó)

new Column {ColumnProperty = p => p.Title}; 

với một cái gì đó lớp như thế này:

public class Column<TModel> 
{ 
     public Expression<Func<TModel, TProperty>> ColumnProperty { get; set; } 
} 

Ý tưởng cơ bản đằng sau nó là tôi tạo ra một Grid từ một loạt các đối tượng Column giống như thế này.

List<Product> productList = GetProductsFromDb(); 
List<Column> columnList = new List<Column>(); 

columnList.Add(new Column<Product> {ColumnProperty = p => p.ProductId, Heading = "Product Id"}); 
columnList.Add(new Column<Product> {ColumnProperty = p => p.Title, Heading = "Title"}); 

Grid myGrid = new Grid(productList, columnList); 

này có thể không phải/cách tidiest dễ nhất để làm điều này nhưng tôi muốn biết liệu nó có thể được thực hiện như tôi muốn cải thiện sự hiểu biết của tôi về biểu hiện và tôi thích được có thể có giá trị mạnh mẽ gõ thay vì của chuỗi chữ, nó đẹp hơn rất nhiều để làm việc.

Bất kỳ suy nghĩ, ý tưởng, lời huyên thuyên sẽ được đánh giá rất

Cheers Rob

Trả lời

7

Khi bạn xác định cái gì đó như Func<TModel, TProperty> nó có nghĩa là có một phương pháp mà phải mất một loại TModel và trả về một loại TProperty. Vì vậy, các biểu thức lambda như

p => p.ProductId 

trả về giá trị của thuộc tính chứ không phải bản thân thuộc tính.

Những gì bạn có thể làm để làm cho công việc cú pháp này là xác định ColumnProperty của bạn như sau:

public Expression<Func<TModel, object>> ColumnProperty { get; set; } 

Sau đó, bạn có thể trích xuất thông tin chi tiết từ cây biểu thức.

+0

Hey idursun - cảm ơn công trình này quá - tôi đã sử dụng năng động thay vì đối tượng nhưng kết quả là như nhau – Rob

1

Ok vì vậy tôi chỉ có một sóng não và thay đổi TProperty để năng động và bây giờ tôi có thể làm điều này vì vậy tôi đoán tôi đã trả lời của riêng tôi câu hỏi nhưng sẽ quan tâm đến việc người dân suy nghĩ khác về những ưu/nhược điểm của phương pháp này:

foreach(Product p in productList) 
{ 
    var value = column.ColumnProperty.Compile().Invoke(p); 
} 

trong thực tế

nếu tôi thay đổi sở hữu của tôi để

public Func<TModel, dynamic> ColumnProperty { get; set; } 

Tôi chỉ có thể làm:

foreach(Product p in productList) 
{ 
    var value = column.ColumnProperty(p); 
} 
+0

Cách tiếp cận biểu thức là một cách tiếp cận tốt. Tôi nghĩ rằng 'năng động' đòi hỏi chi phí cao hơn một chút nhưng có thể chứng minh là có tác động không đáng kể. Một đối tượng động duy trì một từ điển của các thành viên đối tượng đằng sau hậu trường. – IAbstract

Các vấn đề liên quan