Как перевести функцию, записанную в строке в нормальную функцию
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Как перевести функцию, записанную в строке в... Expand / Collapse
Автор
Сообщение
05.04.2007 17:38
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 23.04.2007 23:07
Сообщ.: 1, Visits: 3
Помогите плиз...

Как из функции f(x,y) типа строка, взятой из TextBox, получить обычную функцию (чтобы C# понимал, что это функция, мог подсчитать при подстановке x и y)...
Ну что то, типа Eval из Java бы подошёл бы...
Сообщ. #912283
06.04.2007 1:55


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 29.10.2007 19:07
Сообщ.: 292, Visits: 3 426
Не так в лоб не пройдет, придется тебе анализировать строку (введенную функцию в поле) и соответсвенно иметь библиотеку этих функций.
Сообщ. #912289
18.04.2007 22:50
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 21.05.2008 21:37
Сообщ.: 193, Visits: 2 044
Можно и в лоб, используя динамическое компилирование. Только нужно будет смекалку проявить :)

Вот источник:

using System.Reflection;

using System.CodeDom.Compiler;

using Microsoft.CSharp;      // and/or Microsoft.VisualBasic;

private void button1_Click(object sender, System.EventArgs e)

{

   // *** Example form input has code in a text box

   string lcCode = this.txtCode.Text;

 

   ICodeCompiler loCompiler = new CSharpCodeProvider().CreateCompiler();

   CompilerParameters loParameters = new CompilerParameters();

 

   // *** Start by adding any referenced assemblies

   loParameters.ReferencedAssemblies.Add("System.dll");

   loParameters.ReferencedAssemblies.Add("System.Windows.Forms.dll");

 

   // *** Must create a fully functional assembly as a string

   lcCode = @"using System;

using System.IO;

using System.Windows.Forms;

 

namespace MyNamespace {

public class MyClass {

 

public object DynamicCode(params object[] Parameters) {

"  + lcCode +

"}   }    }";

 

   // *** Load the resulting assembly into memory

   loParameters.GenerateInMemory = false;

  

   // *** Now compile the whole thing

   CompilerResults loCompiled =

           loCompiler.CompileAssemblyFromSource(loParameters,lcCode);

 

   if (loCompiled.Errors.HasErrors)    {

      string lcErrorMsg = "";

 

      lcErrorMsg = loCompiled.Errors.Count.ToString() + " Errors:";

      for (int x=0;x<loCompiled.Errors.Count;x++)

         lcErrorMsg = lcErrorMsg  + "\rLine: " +

                      loCompiled.Errors[x].Line.ToString() + " - " +                          

                      loCompiled.Errors[x].ErrorText;     

 

      MessageBox.Show(lcErrorMsg + "\r\r" + lcCode,

                      "Compiler Demo");

      return;

   }

 

   Assembly loAssembly = loCompiled.CompiledAssembly;

 

   // *** Retrieve an obj ref – generic type only

   object loObject  = loAssembly.CreateInstance("MyNamespace.MyClass");

   if (loObject == null) {

      MessageBox.Show("Couldn't load class.");

      return;

   }

 

   object[] loCodeParms = new object[1];

   loCodeParms[0] = "West Wind Technologies";

  

   try    {

      object loResult = loObject.GetType().InvokeMember(

                       "DynamicCode",BindingFlags.InvokeMethod,

                       null,loObject,loCodeParms);

 

      DateTime ltNow = (DateTime) loResult;

      MessageBox.Show("Method Call Result:\r\r" +

                      loResult.ToString(),"Compiler Demo");

   }

   catch(Exception loError)    {

      MessageBox.Show(loError.Message,"Compiler Demo"); }

}

Сообщ. #912589
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 3:57