Ich habe die folgenden Klassen verweisen:Dynamisch Creation mit einem Konstruktor, der seine Abhängigkeiten
public class Entity<T> where T : Entity<T> {
public Factory<T> Factory { get; private set; }
public Entity(Factory<T> factory) {
Factory = factory;
}
}
public class Factory<T> { }
public class MyEntity : Entity<MyEntity> {
public MyEntity(Factory<MyEntity> factory) : base(factory) { }
}
Ich versuche, dynamisch angegeben Klasse MyEntity mit dem Konstruktor zu erstellen. Bisher habe ich den folgenden Code:
class Program {
static ModuleBuilder _moduleBuilder;
public static ModuleBuilder ModuleBuilder {
get {
if (_moduleBuilder == null) {
AssemblyBuilder asmBuilder = System.Threading.Thread.GetDomain().DefineDynamicAssembly(new AssemblyName("Dynamic"), AssemblyBuilderAccess.Run);
_moduleBuilder = asmBuilder.DefineDynamicModule("MainModule");
}
return _moduleBuilder;
}
}
static void Main(string[] args) {
TypeBuilder typeBuilder = ModuleBuilder.DefineType("MyEntity", TypeAttributes.Public);
Type baseType = typeof(Entity<>).MakeGenericType(typeBuilder);
typeBuilder.SetParent(baseType);
Type factoryType = typeof(Factory<>).MakeGenericType(typeBuilder);
ConstructorBuilder cBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { factoryType });
ILGenerator ctorIL = cBuilder.GetILGenerator();
ctorIL.Emit(OpCodes.Ldarg_0);
ctorIL.Emit(OpCodes.Ldarg_1);
ConstructorInfo c = baseType.GetConstructor(new Type[] { factoryType });
ctorIL.Emit(OpCodes.Call, c);
ctorIL.Emit(OpCodes.Ret);
Type syType = typeBuilder.CreateType();
Console.ReadLine();
}
}
Der Code ist fehlgeschlagen @ConstructorInfo c = baseType.GetConstructor(new Type[] { factoryType })
. Ich habe eine NotSupportedException erhalten.
Gibt es eine Möglichkeit, dies zu erreichen? Ich habe drei Tage lang damit zu tun gehabt. Jede Hilfe wäre willkommen.
Danke!
Aufruf Eric Lippert, Eric Lippert? – Joe
@JoeTuskan: Ich glaube nicht, dass ich hier gebraucht werde; Das ist eine direkte Frage zu Reflection. –