通过lambda表达式传递时,是否有更好的方法来获取属性名称?这是我目前拥有的。
例如。
GetSortingInfo<User>(u => u.UserId);
仅当属性为字符串时,才将其强制转换为memberexpression。因为并非所有属性都是字符串,所以我不得不使用object,但是它将为这些返回unaryexpression。
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; }
我发现您可以执行的另一种方法是对源和属性进行强类型输入并显式推断lambda的输入。不知道这是否是正确的术语,但这是结果。
public static RouteValueDictionary GetInfo<T,P>(this HtmlHelper html, Expression<Func<T, P>> action) where T : class { var expression = (MemberExpression)action.Body; string name = expression.Member.Name; return GetInfo(html, name); }
然后这样称呼它。
GetInfo((User u) => u.UserId);
瞧,它有效。 谢谢大家