通过 lambda 表达式传入时,是否有更好的方法来获取属性名称?这是我目前拥有的。
例如。
GetSortingInfo<User>(u => u.UserId);
只有当属性是字符串时,它才会通过将其转换为成员表达式来工作。因为并非所有属性都是字符串,所以我必须使用对象,但它会为那些返回一元表达式。
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);
瞧,它起作用了。