我正在使用 Reflection.Emit 来构建一个数学表达式解析器(例如2+2
)。一个类接收一个中缀表达式(例如2+2
),将其转换为一个后缀表达式(例如2 2 +
),然后另一个类将该后缀表达式编译为 IL 并创建一个DynamicMethod
. 从那里,可以像在编译时以相似的速度创建表达式一样评估表达式。
这个编译器还支持隐式乘法,所以像这样x(2 + 2)
计算为x * (2 + 2)
现在,我正在尝试实现用户定义的函数(例如f(x)
)。当我试图区分隐式乘法(如上所示)和用户定义的函数时,就会出现问题。这方面的一个例子是,如果用户输入x(5)
,我如何知道他们是要乘以x
,5
还是x
使用参数调用函数5
?
为了解决这个问题,在前一种情况下,编译器将一条if
语句插入到 IL 流中。它调用一个函数来确定该函数是否使用标识符定义x
。如果有,则MethodInfo
通过out
变量和局部变量将实例插入堆栈。
我的实际问题是,是否可以使用堆栈上的实例执行与编译期间MethodInfo
调用速度相当的方法?IlGenerator.Emit(OpCodes.Call, MethodInfo)
谢谢。