2010-11-22 2 views
5

Мое выражение не очень хорошо, и я хотел бы улучшить их, поэтому мне интересно, может ли кто-нибудь объяснить мне, возможно ли создать свойство в классе, которому может быть присвоено значение во время создания экземпляра вот так:Выражение <Func <TModel, TProperty >> как свойство инициализации объекта?

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

или еще лучше (но я думаю, что я толкая его)

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

с классом что-то вроде этого:

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

Основная идея заключается в том, что я создаю Grid из группы объектов Column примерно так.

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); 

Это не может быть tidiest/Самым простым способом сделать это, но я интересно узнать, может ли это быть сделано, как я хочу, чтобы улучшить свое понимание выражений, и я люблю быть в состоянии иметь строго типизированные значения вместо из строковых литералов, с которыми лучше работать.

Любые мысли, идеи, бред был бы весьма признателен

Приветствия Роб

ответ

7

Когда вы определяете что-то вроде Func<TModel, TProperty> это означает, что есть метод, который принимает тип TModel и возвращает тип TProperty. Таким образом, лямбда-выражения, такие как

p => p.ProductId 

возвращает значение свойства, а не свойство.

Что вы можете сделать, чтобы сделать этот синтаксис работы является определение вашего ColumnProperty следующим образом:

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

Затем вы можете извлечь подробную информацию из дерева выражений.

+0

Hey idursun - спасибо, что это тоже работает - я использовал динамический объект вместо объекта, но результат тот же – Rob

1

Хорошо, так что я только что озарение и изменил TProperty к динамическому и теперь я могу это сделать, так что я думаю, я ответил мой собственный вопрос, но будет увлечен других народов мысли о плюсы/минусы такого подхода:

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

на самом деле

если я изменю свое имущество

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

я могу просто сделать:

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

Подход, основанный на выражении, является достойным подходом. Я думаю, что 'dynamic' требует немного больших накладных расходов, но может оказать незначительное влияние. Динамический объект поддерживает словарь элементов объекта за кулисами. – IAbstract

Смежные вопросы