Вы можете создать новый тип во время выполнения и затем скомпилировать выражение в метод такого типа.
Вам нужно создать новую сборку и новый модуль во время выполнения. Создав их, вы можете использовать их для создания как можно большего количества типов. Вот пример кода для создания сборки и модуля:
var assemblyBuilder =
AppDomain.CurrentDomain.DefineDynamicAssembly(
new AssemblyName {Name = "MyNewAssembly"},
AssemblyBuilderAccess.Run);
var moduleBuilder = assemblyBuilder.DefineDynamicModule("MyNewModule");
Теперь вы можете использовать модуль строитель, чтобы определить новый тип, как это:
var typeBuilder = moduleBuilder.DefineType("MyNewType");
а затем новый метод, как это :
var methodBuilder =
typeBuilder.DefineMethod(
"MyNewMethod",
MethodAttributes.Public | MethodAttributes.Static,
typeof(int), //returns an int
new Type[]{}); //takes no parameters
Обратите внимание, что подпись метода должна соответствовать типу делегата выражения.
Далее мы составляем выражение в новый метод с использованием CompileToMethod
метода:
var expression = Expression.Lambda(typeof(Func<int>), Expression.Constant(0));
expression.CompileToMethod(methodBuilder);
Мы генерируем фактический тип от типа строителя:
var type = typeBuilder.CreateType();
Затем мы используем метод Delegate.CreateDelegate
для создайте делегата только что созданному статическому методу:
Func<int> func =
(Func<int>)Delegate.CreateDelegate(
typeof(Func<int>),
type.GetMethod("MyNewMethod"));
int value = func(); //Test
Теперь func.Method.DeclaringType
вернет наш динамически созданный тип.
Вы можете легко использовать этот код для создания некоторых вспомогательных методов, чтобы упростить его использование.
Возможно ли вам создать новый тип во время выполнения? –
@YacoubMassad да, но я бы предпочел самый портативный способ – Vlad