чтобы преобразовать строку в код, я использовал компилятор CodeDom.
Я говорю о компиляции кода C# во время выполнения!
Особенно я хочу сделать компиляцию во время выполнения с несколькими параметрами, типы которых могут быть разными.
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Dynamic;
using System.Net;
using System.Reflection;
using Microsoft.CSharp;
static void Main()
{
String2LineOfCommand("P[0].ToString() + P[1].ToString()", new [] { 2, 4});
}
private void String2LineOfCommand(string expresion1, params object[] P)
{
MethodInfo function = CreateFunction(expresion1);
object result = function.Invoke(null, P);
Console.WriteLine(result.ToString());
}
public static MethodInfo CreateFunction(string function)
{
string code1 = @"
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Dynamic;
namespace UserFunctions
{
public class ParametricFunctions
{
public static object Function1(params int[] P)
{
return " + function + @";
}
}
}
";
var providerOptions = new Dictionary<string, string>();
providerOptions.Add("CompilerVersion", "v4.0");
CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions);
CompilerParameters cp = new CompilerParameters();
cp.GenerateInMemory = true;
cp.TreatWarningsAsErrors = false;
cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("System.Core.dll");
cp.ReferencedAssemblies.Add("System.Windows.dll");
cp.ReferencedAssemblies.Add("System.Dynamic.dll");
CompilerResults results = provider.CompileAssemblyFromSource(cp, code1);
Type parametricFunction1 = results.CompiledAssembly.GetType("UserFunctions.ParametricFunctions");
return parametricFunction1.GetMethod("Function1");
}
Этот код прекрасно работает!
Но, как я уже говорил, я не говорю о параметрах типа int.
Я говорю о разных типах входных параметров в разных ситуациях во время выполнения!
Если я наберу
String2LineOfCommand("P[0].ToString() + P[1].ToString()", 2, 4);
Вместо
String2LineOfCommand("P[0].ToString() + P[1].ToString()", new [] { 2, 4});
Тогда я получу сообщение об ошибке:
An unhandled exception of type 'System.Reflection.TargetParameterCountException' occurred in mscorlib.dll
Additional information: Parameter count mismatch.
Пожалуйста, скажи мне почему?
Также загляните внутрь...
public static MethodInfo CreateFunction(string function)
Когда я пытаюсь ввести
public static object Function1(params object[] P)
вместо
public static object Function1(params int[] P)
Он показывает мне сообщение об ошибке:
An unhandled exception of type 'System.ArgumentException' occurred in mscorlib.dll
Additional information: Object of type 'System.Int32[]' cannot be converted to type 'System.Object[]'.
Но когда я пытаюсь ввести
public static object Function(params dynamic[] P)
компиляция завершается неудачно, и сообщения об ошибке нет!
Кажется, мне не хватает ссылки!
Ключевое слово dynamic доступно для .net 4.0
Я уже писал:
providerOptions.Add("CompilerVersion", "v4.0");
Но никакого результата!
Пожалуйста, помогите мне!