我正在编写一个小型的表达式解析器,希望能够包含方法调用。语法应该像这样:functionName('stringValue',intValue)。
然后,表达式解析器需要查找具有正确签名(在本例中为字符串、整数)的静态函数“functionName”。
解析表达式没有问题,但我遇到了调用正确方法的问题。
到目前为止,我想到的方法是使用简单的Expression.Call:
这个方法很简洁,后续可以编译成可调用的函数。但是,当有多个不同的重载、默认参数、params关键字等情况出现时,情况就变得复杂了。我不想重新实现整个C#的重载解析逻辑,想到使用DLR来帮助我。
使用dynamic关键字,我可以这样写:
然后,表达式解析器需要查找具有正确签名(在本例中为字符串、整数)的静态函数“functionName”。
解析表达式没有问题,但我遇到了调用正确方法的问题。
到目前为止,我想到的方法是使用简单的Expression.Call:
Expression.Call(typeof(MyContext).GetMethod(functionName), parameterExpressions)
这个方法很简洁,后续可以编译成可调用的函数。但是,当有多个不同的重载、默认参数、params关键字等情况出现时,情况就变得复杂了。我不想重新实现整个C#的重载解析逻辑,想到使用DLR来帮助我。
使用dynamic关键字,我可以这样写:
dynamic myC = MyContext;
return myC.functionName(param1, param2);
DLR会找出要调用哪个函数重载。
问题是,我如何通过编程实现这一点?
到目前为止,我还没有成功使用
Expression.Dynamic(..)