実行時に新しい型を作成し、その型のメソッドに式をコンパイルすることができます。
実行時に新しいアセンブリと新しいモジュールを作成する必要があります。それらを作成したら、それらを使って好きなだけ多くの型を作成することができます。ここではアセンブリ、モジュールを作成するためのコードサンプルです:今
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