Я не знаю, возможно ли реализовать Ваш ConvertEquationToCode
функция, однако, можно генерировать структуру данных, которая представляет вычисление, которое необходимо выполнить.
, Например, Вы могли создать дерево, вершины которого представляют вход для Вашего вычисления, узлы, не являющиеся листом которого представляют промежуточные результаты, и чей корневой узел представляет целое вычисление.
Это имеет некоторые преимущества. Например, если Вы делаете то, что - если анализ и хотят изменить значение одного входа за один раз, можно повторно вычислить результаты, которые зависят от значения, которое Вы изменили при сохранении результатов, которые не делают.
Если все остальное перестало работать, под Системой существуют классы. Отражение. Испустите пространство имен, которое можно использовать для создания новых блоков, классов и методов.
Я сделал бы рекурсивную функцию, которая не пишет код, но вместо этого применяет основные операторы к частям строки на основе специальных символов, найденных в той строке. Если больше чем один специальный символ найден, он разбивает строку и называет себя на тех двух частях.
Вы могли запустить здесь и если Вы действительно хотите войти в него, , Шиканье может быть изменено для удовлетворения потребностей. Вы могли также интегрироваться LUA с.NET . Любые три из них могли быть использованы в теле делегата к Вашему ConvertEquationToCode
.
Я сделал это использование CSharpCodeProvider путем создания шаблонного класса и функционального материала как строка константы в моем классе генератора. Затем я ввожу пользовательский код в шаблон и компиляцию.
Это было довольно просто, чтобы сделать, но опасность для этого подхода состоит в том, что пользователь, вводящий уравнение, мог ввести примерно что-либо, что могло быть проблемой безопасности в зависимости от Вашего приложения.
, Если бы безопасность является во всем беспокойством, я рекомендовал бы использовать Деревья Лямбда-выражения, но в противном случае использовать CSharpCodeProvider - довольно устойчивая опция.
Можно попытаться смотреть или на Деревья CodeDom или Лямбда-выражения. Я думаю, что любой из тех должен позволить Вам выполнять это. Деревья выражений являются, вероятно, лучшим способом пойти, но также и иметь кривую высшего образования.
Можно также создать Систему. Xml. XPath. XPathNavigator от пустого, "фиктивного" потока XML, и оценивают выражения с помощью средства анализа XPath:
static object Evaluate ( string xp )
{
return _nav.Evaluate ( xp );
}
static readonly System.Xml.XPath.XPathNavigator _nav
= new System.Xml.XPath.XPathDocument (
new StringReader ( "<r/>" ) ).CreateNavigator ( );
, Если Вы хотите к регистровым переменным использовать в рамках этого выражения, можно динамично создать XML, который можно передать в Оценить перегрузке, которая берет XPathNodeIterator.
<context>
<x>2.151</x>
<y>231.2</y>
</context>
можно затем записать, что выражения как "x / 2 * 0.07914" и затем x являются значением узла в контексте XML. Другая хорошая вещь, у Вас будет доступ ко всем функциям ядра XPath, который включает математику и методы обработки строк и больше материала.
, Если Вы хотите взять его далее, можно даже создать собственный XsltCustomContext (или плохо отправить здесь по требованию), где можно разрешить ссылки на дополнительные функции и переменные:
object result = Evaluate ( "my:func(234) * $myvar" );
my:func отображается на методе C#/.NET, который берет двойное или международное как параметр. myvar регистрируется как переменная в контексте XSLT.
Да, определенно возможный сделать, чтобы пользователь ввел C# в текстовое поле, затем скомпилируйте тот код и выполните его из Вашего приложения. Мы делаем это на моей работе для обеспечения пользовательской бизнес-логики.
Вот статья (я больше, чем не просмотрел ее), который должен запустить Вас:
Вы могли бы попробовать это: Калькулятор. Сеть
Это оценит математическое выражение.
От регистрации его будет поддерживать следующее:
MathEvaluator eval = new MathEvaluator();
//basic math
double result = eval.Evaluate("(2 + 1) * (1 + 2)");
//calling a function
result = eval.Evaluate("sqrt(4)");
//evaluate trigonometric
result = eval.Evaluate("cos(pi * 45 / 180.0)");
//convert inches to feet
result = eval.Evaluate("12 [in->ft]");
//use variable
result = eval.Evaluate("answer * 10");
//add variable
eval.Variables.Add("x", 10);
result = eval.Evaluate("x * 10");
Страница Загрузки И распределяется в соответствии с лицензией BSD.
Попробуйте Vici.Parser: загрузите его здесь (бесплатно) , это самый гибкий анализатор / вычислитель выражений, который я нашел до сих пор.
Вы можете реализовать калькулятор стека постфиксов . В основном, что вам нужно сделать, это преобразовать выражение в постфиксную нотацию, а затем просто перебрать токены в вашем постфиксе для вычисления.
можно использовать system.CodeDom
для генерации кода и компиляции его "на лету".
посмотрите здесь