Да, можно позволить компилятору C# оценить его во времени выполнения.
См.: CSharpCorner
Короткий ответ: Я не думаю так. C#.Net компилируется (в байт-код) и не может оценить строки во времени выполнения, насколько я знаю. JScript.Net может, однако; но я все еще советовал бы Вам кодировать синтаксический анализатор и стековое средство анализа самим.
Нет. Необходимо будет пользоваться некоторой внешней библиотекой или записать собственный синтаксический анализатор. Если у Вас есть время, чтобы сделать так, я предлагаю записать Ваш собственный синтаксический анализатор, поскольку это - довольно интересный проект. Иначе необходимо будет использовать что-то как bcParser.
Вы могли довольно легко выполнить это через CSharpCodeProvider с подходящим пухом, обертывающим его (тип и метод, в основном). Аналогично Вы могли пройти VB и т.д. - или JavaScript, как другой ответ предположил. Я не знаю ни о чем больше встроенном в платформу в этой точке.
я ожидал бы, что.NET 4.0 с ее поддержкой динамических языков может иметь лучшие возможности на этой передней стороне.
Я недавно должен был сделать это для проекта, и я закончил тем, что использовал IronPython, чтобы сделать это. Можно объявить экземпляр механизма, и затем передать любое допустимое выражение Python и получить результат. Если бы Вы просто делаете простые математические выражения, то это было бы достаточно. Мой код закончил тем, что выглядел подобным:
IronPython.Hosting.PythonEngine pythonEngine = new IronPython.Hosting.PythonEngine();
string expression = "3*(2+4)";
double result = pythonEngine.EvaluateAs<double>(expression);
Вы, вероятно, не хотели бы создавать механизм для каждого выражения. Вам также нужна ссылка на IronPython.dll
Вы можете посмотреть "XpathNavigator.Evaluate" Я использовал это для обработки математических выражений для своего GridView, и у меня он отлично работает.
Вот код, который я использовал для своей программы:
public static double Evaluate(string expression)
{
return (double)new System.Xml.XPath.XPathDocument
(new StringReader("<r/>")).CreateNavigator().Evaluate
(string.Format("number({0})", new
System.Text.RegularExpressions.Regex(@"([\+\-\*])")
.Replace(expression, " ${1} ")
.Replace("/", " div ")
.Replace("%", " mod ")));
}
Попробуйте следующее:
static double Evaluate(string expression) {
var loDataTable = new DataTable();
var loDataColumn = new DataColumn("Eval", typeof (double), expression);
loDataTable.Columns.Add(loDataColumn);
loDataTable.Rows.Add(0);
return (double) (loDataTable.Rows[0]["Eval"]);
}
Использование компилятора для выполнения подразумевает утечку памяти, поскольку сгенерированные сборки загружаются и никогда не освобождаются. Это также менее эффективно, чем использование интерпретатора реальных выражений. Для этой цели вы можете использовать Ncalc , который является фреймворком с открытым исходным кодом исключительно с этой целью. Вы также можете определить свои собственные переменные и пользовательские функции, если уже включенных недостаточно.
Пример:
Expression e = new Expression("2 + 3 * 5");
Debug.Assert(17 == e.Evaluate());