Я написал эту функцию один раз, но точно не помню.Но сначала измените подпись делегата на это Func<T, object>
, затем для простых типов данных получите тело выражения и приведите его к MemberExpression и получите имя первого параметра
, если доступный членсложный, вы должны привести тело выражения к UnaryExpression , взять первый параметр и привести его к MemberExpression и сделать то, что вы делали на первом шаге.
Игра сQuickWatch при отладке функции может привести вас к решению.Стоит отметить, что чтение HtmlHelper в MVC-коде может быть полезным.
РЕДАКТИРОВАТЬ: Грубо запомнилось
Лучше всего написать эту функцию как метод расширения (с ограничениемна тип, где это применимо, если хотите), так что предоставление типа Employee также больше не требуется, потому что это выводится из использования.
Итак, ваша функция такова:
public static class Helper
{
public static string Item<TItem,TMember>(this TItem obj, Expression<Func<TItem, TMember>> expression)
{
if (expression.Body is MemberExpression)
{
return ((MemberExpression)(expression.Body)).Member.Name;
}
if(expression.Body is UnaryExpression)
{
return ((MemberExpression)((UnaryExpression)(expression.Body)).Operand).Member.Name;
}
throw new InvalidOperationException();
}
}
Так что ваш код будет намного чище
Employee emp = new Employee();
emp.Item(o=>o.Name);
Надеюсь, вам поможет