Типичным подходом для оценки строковых выражений в C # является построение дерева выражений и компиляция его в делегат (эта работа покрывается .NET framework). В большинстве случаев рекомендуется динамическая библиотека linq , но у нее есть несколько недостатков: она не поддерживается в качестве библиотеки многократного использования (на самом деле это просто иллюстрация возможностей LINQ, опубликованных Скоттом Гу) и может оценивать только строго типизированные выражения, которые плохо в большинстве реальных приложений.
Я предлагаю лучшую альтернативу: анализатор лямбда-выражений из NReco Commons (это бесплатная библиотека с открытым исходным кодом). Он также создает дерево выражений, но использует совершенно другой подход к разбору выражений и оценивает его как дерево выражений: он выполняет гармонизацию и вызовы всех типов во время выполнения (например, динамические языки), поддерживает вызовы свойств и методов, конструирование массивов и условный оператор. Некоторые примеры:
var lambdaParser = new NReco.LambdaParser();
var varContext = new Dictionary<string,object>();
varContext["pi"] = 3.14M;
varContext["one"] = 1M;
varContext["two"] = 2M;
varContext["test"] = "test";
varContext["arr1"] = new double[] { 1.5, 2.5 };
Console.WriteLine( lambdaParser.Eval("pi>one && 0<one ? (1+8)/3+1*two : 0", varContext) ); // --> 5
Console.WriteLine( lambdaParser.Eval(" arr1[0]+arr1[1] ", varContext) ); // -> 4
Console.WriteLine( lambdaParser.Eval(" (new[]{1,2})[1] ", varContext) ); // -> 2
(дополнительные примеры и документацию можно найти на странице библиотеки NReco Commons)