Как передать объект в динамический код в C#
Я использую System.CodeDom.Compiler для генерации динамического кода, мне нужно передать некоторые объекты в функции в коде, но когда я передаю объекты, они ссылаются на мое текущее пространство имен...
string code = @"
using System;
using " + type + @";
namespace First
{
public class Program
{
static " + type + ".Class1 " + type.ToLower() + " = (" + type + ".Class1)"+o + @";
public static bool check () {
if( " + exp
+
@")
return true;
else
return false;
}
public static void Main()
{
" +
" Console.WriteLine(\"Hello, world!\");"
+ @"
}
}
}
";
и я получаю эту ошибку: имя "MineRuleEngine" (мое текущее пространство имен) не существует в текущем контексте
2 ответа
Я передаю объект непосредственно в метод и вызываю это отражением
public static bool check (Object o) {
и поместите параметр "o" в строку, и удалите статический модификатор
type + " " + type.ToLower() + " = " + "(" + type + ")o ;"
Моя проблема в том, что объект "o" относится к MineRuleEngine.person, например. и мой динамический код не знает пространство имен "MineRuleEngine"
Причина, по которой ваш код не знает об этом объекте, заключается в том, что вы должны явно позаботиться об использовании "внешних" ресурсов (т.е. классов)
Вы должны указать using MyNamespace;
в коде, и вы должны добавить ссылку на сборку, содержащую пространство имен.
Например:
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters param = new CompilerParameters(new string[] { "System.dll", "Scripting.dll" });
Также взгляните на этот вопрос. Ссылка на текущую сборку с помощью CompilerParameters.