0
说我有像这样调用一个MethodCallExpression与命名参数常数
public string TestValue(string hello, Guid world)
{
return hello + world;
}
假设objectParams
是对象Dictionary<string, object>
的字典,参数名称映射到值,我目前匹配的参数值的一些功能方法名像这样:
var method = this.GetType().GetMethod("TestValue");
var methodParameters = method.GetParameters();
var paramMatcher = (from paramValue in objectParams
from methodParam in methodParameters
where param.Key == clrParam.Name
select (name: clrParam.Name,
type: clrParam.ParameterType,
value: paramValue.Value));
我那么构建表达式来调用方法TestValue
像这样,但是这是我遇到的麻烦的部分。
var paramExpress = (from param in paramMatcher
select Expression.Assign(Expression.Parameter(param.type, param.name), Expression.Constant(param.value)));
Func<object> result = Expression.Lambda<Func<object>(Expression.Call(Expression.Constant(this),
method, paramExpress)).Compile();
var res = result.Invoke(); //should return 'somestringxxxxxxx-xxxx...etc'
问题是我不能保证参数值是按呼叫顺序的,所以我想依靠参数的名称来调用。我不确定如何正确地将常量值分配给它们的参数表达式。编译lambda时运行此代码会导致例外System.InvalidOperationException: 'variable 'hello' of type 'System.String' referenced from scope '', but it is not defined'
。
谢谢,但是选择双元表达权值调用拉姆达时没有考虑到的名称和参数位置。如果字典按错误的顺序读取,那么参数将被不同地解析。 – ron975
@ ron975好吧,我更新了我的答案。 – Nikita
谢谢,这很好! – ron975