Func deklarieren <in T, out Result> dynamisch

anonymous-methods c# expression-trees lambda predicate

Frage

Bedenken Sie:

var propertyinfo = typeof(Customer).GetProperty(sortExpressionStr);
Type orderType = propertyinfo.PropertyType;

jetzt möchte ich erklären

var propertyinfo = typeof(Customer).GetProperty(sortExpressionStr);
Type orderType = propertyinfo.PropertyType;

Ich weiß, dass es nicht direkt möglich ist, da ordertype zur Laufzeit ist, aber gibt es einen Workaround?

Genau das möchte ich tun:

var propertyinfo = typeof(Customer).GetProperty(sortExpressionStr);
Type orderType = propertyinfo.PropertyType;

all das, weil ich konvertieren will:

var propertyinfo = typeof(Customer).GetProperty(sortExpressionStr);
Type orderType = propertyinfo.PropertyType;

oder wenn es nicht möglich ist, dann möchte ich es von der ersten Stelle mit dem richtigen Typ erstellen, der Fall ist wie folgt:

Ich bin innerhalb einer Methode, die einen type(Customer) und einen Eigenschaftsnamen des Typs, den ich von ihm bestellen möchte, Ich möchte einen Orderby erstellen, um es an Orderby (hier) zu übergeben.

Akzeptierte Antwort

linqClass.OrderBy(GetSortExpression(sortstr));


public static Expression<Func<T,object>> GetSortExpression<T>(string sortExpressionStr)
    {
        var param = Expression.Parameter(typeof(T), "x");
        var sortExpression = Expression.Lambda<Func<T, object>>(Expression.Property(param, sortExpressionStr), param);
        return sortExpression;
    }

das funktionierte mein Problem war, dass ich extra Parameter Typeof (Object) und orderby übergeben habe, um mir zu sagen, dass es nicht nach Objekttyp sortiert werden kann. Danke allen

Danke dtb Ich werde überprüfen, ob Ihre Antwort auch funktioniert, und ich werde es akzeptieren, wenn es funktioniert, wenn nicht, werde ich thsi eins akzeptieren.


Beliebte Antwort

Sie können dies tun, indem Sie eine offene generische Typdefinition verwenden und dann den spezifischen Typ daraus machen:

typeof(Func<,>).MakeGenericType(typeof(int), orderType);

Was Sie jedoch versuchen (Aufruf von Lambda<TDelegate> ), ist nicht direkt möglich. Sie müssen Lambda ohne einen Typparameter aufrufen:

typeof(Func<,>).MakeGenericType(typeof(int), orderType);

Dies wird den richtigen Func<,> für Sie hinter den Kulissen schaffen. Wenn Sie den Ausdruck kompilieren und den Delegaten verwenden möchten, können Sie dies nur dynamisch mit tun

typeof(Func<,>).MakeGenericType(typeof(int), orderType);

Wenn Sie die Methode Queryable auf Queryable OrderBy Queryable , werden die Dinge ein wenig komplizierter:

typeof(Func<,>).MakeGenericType(typeof(int), orderType);



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum