构建表达式树时,我需要使用调用外部方法的节点来获取表达式可以继续评估的值。这些方法被提供为
执行上述调用的最正确的方法是什么?我尝试过类似这样的方法:
只要从字典获取的方法是在编译时创建的,那么它就可以正常工作。但是,在动态方法
Func<T>
,我的代码不知道它们来自哪里。执行上述调用的最正确的方法是什么?我尝试过类似这样的方法:
private Dictionary<string, Delegate> _externalSymbols;
private Expression _forExternalSymbol(string identifier)
{
Delegate method = _externalSymbols[identifier];
return Expression.Call(method.Method);
}
只要从字典获取的方法是在编译时创建的,那么它就可以正常工作。但是,在动态方法
Func<T>
情况下,例如通过在运行时编译另一个表达式获得,这将不起作用,会抛出以下异常:
将给定函数包装在一个额外的表达式中可能实现期望的效果,但与原来的代码相比,这似乎相当丑陋。ArgumentException: 调用方法“Int32 lambda_method(System.Runtime.CompilerServices.ExecutionScope)”时提供了错误数量的参数
private Expression _forExternalSymbol(string identifier)
{
Delegate method = _externalSymbols[identifier];
Expression mediator = method is Func<double> ?
(Expression)(Expression<Func<double>>)(() => ((Func<double>)method)()) :
(Expression<Func<string>>)(() => ((Func<string>)method)());
return Expression.Invoke(mediator);
}
此外,这种方法很难扩展,如果我需要支持除double
和string
之外的其他类型。
我想知道是否有更好的选项可以与动态创建的方法配合使用(最好适用于.NET 3.5)。
Func<T>
委托,其中 T 可以是double
或string
(这些类型的列表可能需要在将来进行扩展)。 - Denis Aldoshin