2013-06-10 17 views
7

Attualmente, ho un sacco di classi di questo modulo che vorrei creare in fase di esecuzione utilizzando Reflection.Emit. Comunque, sto correndo in un problema quando si tenta di aggiungere il genitore - dal momento che la classe TestAdmin non esiste prima del tempo di esecuzione, non so come creareUtilizzo del tipo emesso come parametro tipo in Reflection.Emit

TestUserBase<TestAdmin> 

Tutte le idee?

+0

Hai problemi in particolare perché l'argomento della classe generica di base è * questa * classe? –

+0

Credo che tu abbia un problema di gallina e uova ... Il compilatore C# potrebbe essere in grado di farlo perché probabilmente non sta usando Reflection.Emit per generare l'IL. Non sono sicuro se esiste una soluzione a questo problema ... –

+0

Il metodo make-generic accetta il type-builder? In realtà, però, mi sembra di ricordare alcune zone spinose di pollo/uova con cui il-emit lotta. Ultimamente sto usando IKVM-reflection che ha la stessa api di reflection-emit ma che corregge molte di queste aree –

risposta

7

È possibile impostare il tipo di genitore con SetParent:

TypeBuilder tb = mb.DefineType("TestAdmin", TypeAttributes.Public); 
tb.SetParent(typeof(TestUserBase<>).MakeGenericType(tb)); 

Type theType = tb.CreateType(); 
+0

Fantastico, grazie! Questo sembra proprio quello di cui ho bisogno. –

3

OK. Non sono stato in grado di testarlo a fondo, ma penso che sia possibile. Provare qualcosa di simile:

Assumendo che il classe base generica è già definita (ad esempio, non sta generando TestUserBase<T>), si dovrebbe essere in grado di fare qualcosa del genere:

var emittedType = module.DefineType("TestAdmin", TypeAttributes.Public | TypeAttributes.Class); 
var baseType = typeof(TestUserBase<>).MakeGenericType(type); 
emittedType.SetParent(baseType); 

Naturalmente, se TestUserBase<T> viene generato, è possibile utilizzare la stessa logica utilizzando MakeGenericType sul tipo dinamico TestUserBase<T>. La logica SetParent è la stessa.

Problemi correlati