Update: Dies funktioniert, ich wäre blöd :(Parameter Problem mit Expression.Lambda()
Ich habe folgende Erweiterungsmethode
public static string ExtMethod(this object self, object myparameter);
zur Laufzeit dieses in einem beliebigen Zahl genannt wird Möglichkeiten, Wege, ich glaube, das sind alles Möglichkeiten:
Expression<Func<T, string>> expr = x => x.property.ExtMethod(5);
Expression<Func<T, string>> expr = x => x.property.ExtMethod(new object());
Expression<Func<T, string>> expr = x => x.property.ExtMethod(someMethod());
Expression<Func<T, string>> expr = x => x.property.ExtMethod(x.someMethod());
Expression<Func<T, string>> expr = x => x.property.ExtMethod(x.OtherProperty);
, was ich die „myparameter
“ tun müssen, ist zu bewerten, da "expr
"und eine" T
"
wegen der beiden Fälle, in denen x
in myparameter
verwendet wird, ich dachte, ich brauchte einen Delegierten der Form zu erstellen:
Expression<Func<T, object>> expr = x => [myparameter expression here]
i gedacht funktionieren würde:
var extMethodExpr = expr.Body as MethodCallExpression;
var myparameterExpr = extMethodExpr.Arguments[1];
var myparam = Expression.Lambda(myparameterExpr, expr.Parameters).Compile().Invoke(someT)
aber für die Ausdrücke, die x
nicht verbunden,
i erhalten
TargetParameterCountException
:(
in diesen Fällen, wenn ich tun:
var myparam = Expression.Lambda(myparameterExpr).Compile().Invoke(someT)
es funktioniert gut.
Wie löse ich das?
dank
Das ist hardcore ... Kann immer noch nicht verstehen, was das Problem ist. :) –
Erweiterungsmethoden auf Objekt sind selten eine gute Idee; und (Pedant) du erstellst einen Ausdrucksbaum (kein Delegierter) - aber schau jetzt ... –
@Marc das ist nur Pseudocode;) –