Если вы все равно выполняете синтаксический анализ для извлечения операндов и операторов в своих выражениях, почему бы вам просто не вызвать конкретные функции для выполнения различных операций?Это было бы значительно проще, чем создавать и компилировать IL на лету.В вашем примере вы можете сделать следующее:
MyStack<object> m_oStack = new MyStack<object> ();
double Add () // takes 2 params from stack
{
return ( m_oStack.Pop () + m_oStack.Pop () );
}
double Multiply () // takes 2 params from stack
{
return ( m_oStack.Pop () * m_oStack.Pop () );
}
// during evaluating the expression:
... // parse
m_oStack.Push ( fB );
... // parse
m_oStack.Push ( fC );
... // parse
m_oStack.Push ( Multiply () );
... // parse
m_oParamStack.Push ( fA );
... // parse
m_oParamStack.Push ( Add () );
// you're done with evaluating the expression, the result is
// on top of the stack
Таким образом, когда вы оцениваете различные части вашего выражения, вы просто сохраняете значения в стеке и вызываете свои собственные функции, когда вы анализируете различные подпрограммы.Выражения.
Это все выполнимо, испуская IL, но это будет значительно сложнее, так как вам все равно придется выполнять весь анализ, управлять всеми входными параметрами и т. д., но вдобавок ко всемуВы также должны испустить IL, а затем выполнить его на лету.