Sie können zur Laufzeit einen neuen Typ erstellen und den Ausdruck dann in eine Methode dieses Typs kompilieren.
Sie müssen zur Laufzeit eine neue Baugruppe und ein neues Modul erstellen. Sobald Sie diese erstellt haben, können Sie sie verwenden, um so viele Typen wie Sie möchten zu erstellen. Hier ist ein Codebeispiel die Montage und das Modul zu erstellen:
var assemblyBuilder =
AppDomain.CurrentDomain.DefineDynamicAssembly(
new AssemblyName {Name = "MyNewAssembly"},
AssemblyBuilderAccess.Run);
var moduleBuilder = assemblyBuilder.DefineDynamicModule("MyNewModule");
Nun können Sie das Modul-Builder verwenden, um einen neuen Typ wie folgt zu definieren:
var typeBuilder = moduleBuilder.DefineType("MyNewType");
und dann eine neue Methode wie folgt :
var methodBuilder =
typeBuilder.DefineMethod(
"MyNewMethod",
MethodAttributes.Public | MethodAttributes.Static,
typeof(int), //returns an int
new Type[]{}); //takes no parameters
Bitte beachten Sie, dass die Methodensignatur Ihren Ausdruck Delegattyp übereinstimmen sollte.
Als nächstes erstellen wir den Ausdruck in der neuen Methode unter Verwendung des CompileToMethod
Methode:
var expression = Expression.Lambda(typeof(Func<int>), Expression.Constant(0));
expression.CompileToMethod(methodBuilder);
Wir erzeugen den tatsächlichen Typ vom Typ Bauer:
var type = typeBuilder.CreateType();
Dann verwenden wir die Delegate.CreateDelegate
Methode Erstellen Sie einen Delegaten für die neu erstellte statische Methode wie folgt:
Func<int> func =
(Func<int>)Delegate.CreateDelegate(
typeof(Func<int>),
type.GetMethod("MyNewMethod"));
int value = func(); //Test
Jetzt würde func.Method.DeclaringType
unseren dynamisch erstellten Typ zurückgeben.
Sie können diesen Code verwenden, um einige Hilfsmethoden zu generieren, um die Verwendung zu vereinfachen.
Ist es eine Option für Sie, einen neuen Typ zur Laufzeit zu erstellen? –
@YacoubMassad ja, aber ich würde die beweglichste Methode bevorzugen – Vlad