更新:这确实有效,我很愚蠢:(
我有以下扩展方法
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)
效果很好。
我该如何解决这个问题?
thanks