Expression.Lambda变量''类型' System.String'从范围''引用,但未定义

时间:2015-07-19 08:21:48

标签: c# reflection

我正在尝试构建一个将函数委托加载到字典的系统,然后可以从环境中的任何地方调用它们,询问代表的字典。

我的功能格式为Func<string, string>

我的代码是

var methods = typeof(Keywords)
    .GetMethods()
    .Where(mt => mt.GetCustomAttributes(typeof(KDTAttribute), false).Count() > 0);

foreach (var method in methods)
{
    string key = ((KDTAttribute)method.GetCustomAttributes(typeof(KDTAttribute), false)[0]).Keyword;
    var combinedArgumentsExp = new Expression[] { Expression.Parameter(typeof(string),"param") };
    var mtCall = Expression.Call(Expression.Constant(me), method,combinedArgumentsExp);
    ParameterExpression targetExpr = Expression.Parameter(typeof(string), "param");
    Func<string, string> result = Expression.Lambda<Func<string, string>>(mtCall, targetExpr).Compile();
    retVal.Add(key, result);
}

我在Expression.Lambda行上获得了例外:

  

变量&#39; param&#39;类型&#39; System.String&#39;引用范围&#39;&#39;,但未定义。

P.S:
如果有更好的方法在运行时将代表加载到字典中,我会对任何建议感到高兴。

1 个答案:

答案 0 :(得分:3)

您正在调用Expression.Parameter两次,这会为您提供不同的表达方式。不要这样做 - 只需调用一次,然后使用ParameterExpression这两个你需要的地方:

var parameter = Expression.Parameter(typeof(string),"param");
string key = ((KDTAttribute)method.GetCustomAttributes(typeof(KDTAttribute), false)[0]).Keyword;
var mtCall = Expression.Call(Expression.Constant(me), method, parameter);
var result = Expression.Lambda<Func<string, string>>(mtCall, parameter).Compile();