小编典典

从 lambda 表达式中检索属性名称

all

通过 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;
}

阅读 94

收藏
2022-03-08

共1个答案

小编典典

我发现另一种方法是对源和属性进行强类型化并显式推断 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);

瞧,它起作用了。

2022-03-08