通过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;
}
MemberExpression
此处列出的方法仅获取成员的姓名,而不获取实际的MemberInfo
本身,因为MemberInfo
在某些“派生的:基本”方案中,不能保证返回的类型是反映类型的。参见lambda-expression-not-returning-expected-memberinfo。绊了我一次。公认的答案也受此困扰。