Выберите свойство модели, используя лямбду, а не имя свойства строки - PullRequest
9 голосов
/ 24 августа 2010

Я создаю список свойств типа для включения в экспорт коллекции этого типа. Я хотел бы сделать это без использования строк для имен свойств. Только определенные свойства типа должны быть включены в список. Я хотел бы сделать что-то вроде:

exportPropertyList<JobCard>.Add(jc => jc.CompletionDate, "Date of Completion");

Как я могу реализовать этот общий метод Add? Кстати, строка является описанием свойства.

Ответы [ 2 ]

10 голосов
/ 24 августа 2010

Вы можете получить объект PropertyInfo, изучив переданное выражение. Что-то вроде:

public void Add<T>(Expression<Func<T,object>> expression, string displayName)
{
    var memberExpression = expression.Body as MemberExpression;
    PropertyInfo prop = memberExpression.Member as PropertyInfo;
    // Add property here to some collection, etc ? 
}

Это неполная реализация, потому что я не знаю, что именно вы хотите сделать со свойством - но он показывает, как получить PropertyInfo из Expression - объект PropertyInfo содержит все метаданные о свойстве. Кроме того, обязательно добавьте обработку ошибок к приведенному выше, прежде чем применять ее в производственном коде (т. Е. Защитите выражение, не являющееся выражением MemberExpression и т. Д.).

1 голос
/ 22 июля 2014

Превосходная конфигурация селектора выглядит следующим образом:

public void MethodConsumingSelector<TContainer, TSelected>(Expression<Func<TContainer, TSelected>> selector)
{
     var memberExpresion = expression.Body as MemberExpression;
     var propertyInfo = memberExpression.Member as PropertyInfo;
}

Это предотвращает передачу переданного выражения как UnaryExpression, содержащее Convert(x => x.ValueTypeProperty), когда ваш селектор нацелен на тип значения.

См. Связанный вопрос относительно UnaryExpression против MemberExpression для SO здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...