【发布时间】:2017-07-09 20:52:50
【问题描述】:
假设我有这样的功能
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'。
【问题讨论】:
标签: c# dynamic reflection lambda expression