Recupero del nome della proprietà dall'espressione lambda

c# expression-trees lambda linq

Domanda

C'è un modo migliore per ottenere il nome della proprietà quando viene trasmesso tramite un'espressione lambda? Ecco cosa ho attualmente.

per esempio.

GetSortingInfo<User>(u => u.UserId);

Ha funzionato lanciandolo come memberexpression solo quando la proprietà era una stringa. perché non tutte le proprietà sono stringhe ho dovuto usare l'oggetto ma poi restituirebbe un'espressione unaria per quelle.

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

Risposta accettata

Ho trovato un altro modo in cui è possibile fare in modo che l'origine e la proprietà siano fortemente digitate e dedurre esplicitamente l'input per il lambda. Non sono sicuro se questa è la terminologia corretta, ma qui è il risultato.

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);
}

E poi chiamalo così.

GetInfo((User u) => u.UserId);

e voilà funziona.
Ringrazia tutti.


Risposta esperta

Beh, non c'è bisogno di chiamare .Name.ToString() , ma in generale è tutto, sì. L'unica considerazione di cui potresti aver bisogno è se x.Foo.Bar debba restituire "Foo", "Bar" o un'eccezione, cioè devi x.Foo.Bar iterare.

(commento) per ulteriori informazioni sull'ordinamento flessibile, vedere qui .



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché