我正在使用Reflection.Emit构建数学表达式分析器(例如2+2
)。一个类采用中缀表达式(例如2+2
),将其转换为后缀表达式(例如2 2 +
),然后另一个类将该后缀表达式编译为IL并创建一个DynamicMethod
。从那里,可以评估表达式,就好像它是在编译时创建的一样,具有相似的速度。使用Reflection调用使用MethodInfo实例的方法。使用Reflection.Emit
该编译器也支持隐式乘法,所以像x(2 + 2)
目前计算为x * (2 + 2)
,我试图实现用户自定义函数(例如f(x)
)。当我试图区分隐式乘法(如上所示)和用户定义的函数时,会出现问题。例如,如果用户输入x(5)
,我如何知道他们是否要将x
乘以5
,或者调用x
函数的参数为5
?
为了解决这个问题,在前面的例子中,编译器在IL流中插入if
语句。它调用一个函数来确定函数是否以x
的标识符定义。如果有的话,它会通过out
变量和本地值将一个MethodInfo
实例插入堆栈。
我的实际问题是,是否有可能执行一个方法使用堆栈上的MethodInfo
实例在编译过程中等价于调用IlGenerator.Emit(OpCodes.Call, MethodInfo)
?
谢谢。
设计建议:使乘法明确,或具有不同的函数调用语法。含糊不清的语法导致错误/难以识别用户错误。你知道标准的算术符号很糟糕,或者你不会转换为后缀,这是其中一个原因:) – 2010-08-20 03:27:57