Чи є кращий спосіб отримати ім'я властивості при передачі через лямбда-вираз? Ось що я зараз маю.
напр.
GetSortingInfo<User>(u => u.UserId);
Він працював, передаючи його як memberexpression лише тоді, коли властивість була рядком. тому що не всі властивості є рядками, я повинен був використовувати об'єкт, але тоді він поверне для них неекспресію.
public static RouteValueDictionary GetInfo<T>(this HtmlHelper html,
Expression<Func<T, object>> action) where T : class
{
var expression = GetMemberInfo(action);
string name = expression.Member.Name;
return GetInfo(html, name);
}
private static MemberExpression GetMemberInfo(Expression method)
{
LambdaExpression lambda = method as LambdaExpression;
if (lambda == null)
throw new ArgumentNullException("method");
MemberExpression memberExpr = null;
if (lambda.Body.NodeType == ExpressionType.Convert)
{
memberExpr =
((UnaryExpression)lambda.Body).Operand as MemberExpression;
}
else if (lambda.Body.NodeType == ExpressionType.MemberAccess)
{
memberExpr = lambda.Body as MemberExpression;
}
if (memberExpr == null)
throw new ArgumentException("method");
return memberExpr;
}
MemberExpression
наведений тут підхід лише для того, щоб отримати ім'я учасника, а не отримати власне фактичне MemberInfo
, оскільки MemberInfo
повернене не гарантовано буде відображеним типом у певних сценаріях "дерві: базова". Дивіться лямбда-експресію-не повертається-очікує-член-учасник . Зупинив мене один раз. Прийнята відповідь теж страждає від цього.