C# 表达式树中的动态方法调用

C# 表达式树中的动态方法调用,c#,.net-3.5,expression-trees,dynamicmethod,dynamic-method,C#,.net 3.5,Expression Trees,Dynamicmethod,Dynamic Method,在构造表达式树时,我必须使用调用外部方法的节点来获取表达式可以继续计算的值。 这些方法作为Func提供,我的代码不知道它们的来源 执行上述调用的最正确方法是什么?我试过这样的方法: private Dictionary<string, Delegate> _externalSymbols; private Expression _forExternalSymbol(string identifier) { Delegate method = _externalSymbols

在构造表达式树时,我必须使用调用外部方法的节点来获取表达式可以继续计算的值。 这些方法作为
Func
提供,我的代码不知道它们的来源

执行上述调用的最正确方法是什么?我试过这样的方法:

private Dictionary<string, Delegate> _externalSymbols;

private Expression _forExternalSymbol(string identifier)
{
    Delegate method = _externalSymbols[identifier];
    return Expression.Call(method.Method);
}
此外,如果我需要添加对
double
string
以外的类型的支持,那么这几乎不是一种可扩展的方法

我想知道是否有更好的选项可以用于动态创建的方法(最好适用于.NET3.5)

只要在编译时创建从字典中获取的
方法
,它就可以工作

不,只要
方法
是静态的,它就可以工作。例如,如果委托是一个lambda,它引用了其父分数中的某些内容(即,它是一个闭包),那么它也不起作用

调用委托的正确方法是使用。要获取代表您的委托的
表达式,请使用
Expression.Constant()


争论呢?这些方法是否接受任何参数?@nightwatch No arguments,dictionary保证只包含
Func
委托,T为
double
string
(这些类型的列表将来可能需要扩展)。我不太了解linq表达式,抱歉。但您所做的看起来像是一个动态调用,在运行时解析方法名。也许您可以使用动态对象作为外部函数的接口?实际上,它适用于非静态方法(在这种情况下,重载版本必须与
Expression.Constant(method.Target)
一起使用,作为第一个参数,按bad)。问题是,动态方法没有
目标。你的回答正是我需要的,谢谢!
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);
}
Expression.Invoke(Expression.Constant(method)))