2014-02-04 4 views
0

Сценарий:Компиляция кода в виде строки

У меня есть имена функций и там параметры хранятся в базе данных. Имя функции наряду с параметрами являются возврат из базы данных

"FunctionName(Convert.ToString("harry"),Convert.ToString("Password"),Convert.ToInt32("5"),Convert.ToString(""),Convert.ToString("AMER_02772"),Convert.ToInt32("0"))" 

Вопрос:

Теперь я хочу, чтобы выполнить эту функцию вернулась ко мне в виде строки? Укажите, как выполнить эту строку?

Я прочитал подобное сообщение, но не смог найти точный результат.

+0

Посмотрите на отражение –

+0

Это на самом деле довольно сложным. По существу, это будет связано с созданием динамической сборки; например, код в строке должен быть скомпилирован во время выполнения. Необходимо пространство имен System.CodeDom. Взгляните на этот вопрос SO: http://stackoverflow.com/questions/4800267/how-to-execute-code-that-is-in-a-string –

ответ

0

Вы можете использовать GetMethod, это пример кода

using System; 
using System.Reflection; 

static class Methods 
{ 
public static void Inform(string parameter) 
{ 
Console.WriteLine("Inform:parameter={0}", parameter); 
} 
} 

class Program 
{ 
    static void Main() 
    { 
    // Name of the method we want to call. 
    string name = "Inform"; 

    // Call it with each of these parameters. 
    string[] parameters = { "Sam", "Perls" }; 

    // Get MethodInfo. 
    Type type = typeof(Methods); 
    MethodInfo info = type.GetMethod(name); 

    // Loop over parameters. 
    foreach (string parameter in parameters) 
    { 
     info.Invoke(null, new object[] { parameter }); 
    } 
    } 
} 

Output 

Inform:parameter=Sam 
Inform:parameter=Perls 

Или

Вы можете ссылаться на Dynamically invoking any function by passing function name as string!
И CodeProject link Dynamically Invoke A Method, Given Strings with Method Name and Class Name!

0

Посмотрите на CSharpCodeProvider class

В качестве примера:

var csc = new CSharpCodeProvider(new Dictionary<string, string>() { { "CompilerVersion", "v3.5" } }); 
     var parameters = new CompilerParameters(new[] { "mscorlib.dll", "System.Core.dll" }); 
     parameters.GenerateExecutable = false; 
     CompilerResults results = csc.CompileAssemblyFromSource(parameters, 
     @"using System.Linq; 
      class MyClass { 
       public void MyFunction() { 
       var q = from i in Enumerable.Range(1,100) 
          where i % 2 == 0 
          select i; 
       } 
      }"); 
     results.Errors.Cast<CompilerError>().ToList().ForEach(error => Console.WriteLine(error.ErrorText)); 
0

Вы можете использовать CodeDomProvider для компиляции C# код. Затем используйте отражение, чтобы получить информацию о типе, создать объект и вызвать его метод.

См. Пример this answer.

Это в основном, как это работает:

string source = ... 
    string references = ... 

    // Compile 
    CodeDomProvider provider = new CSharpCodeProvider(); 
    CompilerParameters cp = new CompilerParameters(references); 
    cp.GenerateExecutable = false; 
    cp.GenerateInMemory = true; 
    CompilerResults res = provider.CompileAssemblyFromSource(cp, source); 

    // Extract object 
    Type t = res.CompiledAssembly.GetType(className); 
    MethodInfo method = t.GetMethod(methodName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);   // Get method 

    // Run 
    object instance = Activator.CreateInstance(t, this); 
    object ret = method.Invoke(instance, null); 
Смежные вопросы