Обновление: это работает, я был глуп: (
у меня есть следующий метод расширения
public static string ExtMethod(this object self, object myparameter);
во время выполнения это называется разными способами, я думаю, что это все возможности:
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);
что мне нужно сделать, это оценить "myparameter
", учитывая "expr
" и "T
"
из-за двух случаев, когда x
используется в myparameter
, я подумал, что мне нужно создать делегата в форме:
Expression<Func<T, object>> expr = x => [myparameter expression here]
я думал, что это сработает:
var extMethodExpr = expr.Body as MethodCallExpression;
var myparameterExpr = extMethodExpr.Arguments[1];
var myparam = Expression.Lambda(myparameterExpr, expr.Parameters).Compile().Invoke(someT)
но для выражений, которые не включают x
, я получаю TargetParameterCountException
: (
в этих случаях, если я сделаю:
var myparam = Expression.Lambda(myparameterExpr).Compile().Invoke(someT)
работает нормально.
Как мне это решить?
спасибо