Образцы VS2008 включали в себя отличную ExpressionParser
, которую можно использовать в качестве синтаксического анализатора обобщенных выражений ( Образцы VS2008 ). С помощью нескольких небольших обновлений и пользовательского класса фабрики мы можем превратить его в нечто более выразительное:
string expression = "(1 + 2)";
var func = FunctionFactory.Create<int>(expression);
Или:
expression = "(a * b)";
var func2 = FunctionFactory.Create<int, int, int>(expression, new[] { "a", "b" });
Возвращаемыми типами этих Create
методов являются Func<>
экземпляры, что означает, что мы получаем хорошие строго типовые делегаты:
int result = func2(45, 100); // result = 450;
Я отправил код в гист
Обновление : я недавно тоже писал об этом .
Обновление 2 , другой пример:
var person = new Person { Age = 5 };
string expression = "(Age == 5)";
var func3 = FunctionFactory.Create<Person, bool>(expression);
bool isFive = func3(person); // Should be true.