7 Stimmen

Rückgabe eines verschachtelten generischen Ausdrucks<Func<T, bool>>

Die Fehlermeldung lautet: "Der Typ- oder Namespace-Name 'T' konnte nicht gefunden werden."

???

public static Expression<Func<T, bool>> MakeFilter(string prop, object val)
{
    ParameterExpression pe = Expression.Parameter(typeof(T), "p");
    PropertyInfo pi = typeof(T).GetProperty(prop);
    MemberExpression me = Expression.MakeMemberAccess(pe, pi);
    ConstantExpression ce = Expression.Constant(val);
    BinaryExpression be = Expression.Equal(me, ce);
    return Expression.Lambda<Func<T, bool>>(be, pe);
}

Verwandte Links:

Reflection verwenden, um eine Linqed-Eigenschaft zu adressieren

http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/df9dba6e-4615-478d-9d8a-9fd80c941ea2/

Erzeugung einer generischen Func<T> zur Laufzeit

10voto

Lasse V. Karlsen Punkte 364542

Sie müssen die Methode selbst generisch machen:

public static Expression<Func<T, bool>> MakeFilter<T>(string prop, object val)
                                                  -+-
                                                   ^
                                                   +- this

3voto

mmx Punkte 400975

Es ist kein generisches Argument für Ihre Methode definiert. Sie sollten eines definieren ( MakeFilter<T> ):

public static Expression<Func<T, bool>> MakeFilter<T>(string prop, object val)
{
    ParameterExpression pe = Expression.Parameter(typeof(T), "p");
    PropertyInfo pi = typeof(T).GetProperty(prop);
    MemberExpression me = Expression.MakeMemberAccess(pe, pi);
    ConstantExpression ce = Expression.Constant(val);
    BinaryExpression be = Expression.Equal(me, ce);
    return Expression.Lambda<Func<T, bool>>(be, pe);
}

2voto

Rex M Punkte 138455

Die Methode muss als generisch deklariert werden ( MakeFilter<T> ):

public static Expression<Func<T, bool>> MakeFilter<T>(string prop, object val)

Wie sollte der Anrufer sonst angeben können, welche T ist?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X