Classe generato dinamicamente che implementa IEnumerator GetEnumerator () e IEnumerator IEnumerable.GetEnumerator ()
-
08-10-2019 - |
Domanda
Ho un problema con Reflection.Emit. Voglio avere classe creata in modo dinamico, che ha semplice implementazione di ICollection. Tutti i metodi ho definito bene, invece di due successive: pubblico IEnumerator GetEnumerator () e IEnumerator IEnumerable.GetEnumerator () Prossimi spettacoli di codici a quello che voglio essere nella mia classe dinamica:
public class SomeClassThatIsIEnumerable<T> : IEnumerable<T>
{
public IEnumerator<T> GetEnumerator()
{...}
IEnumerator IEnumerable.GetEnumerator()
{...}
}
Questo è uscita dal riflettore aperto il mio dinamica di montaggio:
public class SomeClassThatIsIEnumerable<T> : IEnumerable<T>
{
public IEnumerator<T> GetEnumerator()
{
...
}
IEnumerator GetEnumerator()
{
...
}
}
Sto definendo la mia classe In tal modo:
TypeBuilder myType = module.DefineType("myType"...);
myType.AddInterfaceImplementation(typeof(IEnumerable));
myType.AddInterfaceImplementation(typeof(IEnumerable<T>));
myType.AddInterfaceImplementation(typeof(ICollection<T>));
myType.DefineMethodOverride(myDefineGetEnumerator(...),typeof(IEnumerable).GetMethod("GetEnumerator");
myType.DefineMethodOverride(myDefineGetGenericEnumerator(...),typeof(IEnumerable<T>).GetMethod("GetEnumerator);
//Definitions of other ICollection methods
//Define GetEnumerator is looks like this:
MethodBuilder method = myType.DefineMethod("GetEnumerator", MethodAttributes.Final | MethodAttributes.Virtual...)
ILGenerator il = method.GetILGenerator();
// adding opcodes
quando chiamo myType.CreateType TypeLoadException tiri liberi con il metodo GetEnumerator messaggio non ha implementazione. Sto suggerendo il problema con metodo IEnumerable.GetEnumerator, perché ho avuto problemi a scriverlo su C #, nemmeno in IL :). Qualcuno può aiutarmi?
Soluzione 2
La risposta è stata prossima a definire il metodo
MethodBuilder myMethod = myType.DefineMethod("System.Collections.IEnumerable.GetEnumerator",
MethodAttributes.Private | MethodAttributes.HideBySig |
MethodAttributes.NewSlot | MethodAttributes.Virtual |
MethodAttributes.Final);
E 'stato sorprendente per me che scrivere il nome di un'interfaccia in nome del metodo sarebbe quello di stabilire un rapporto unico con l'interfaccia
Altri suggerimenti
Sembra si dovrebbe forse usando DefineMethod
piuttosto che DefineMethodOverride
. C'è un esempio di emettere un implementazione dell'interfaccia esplicita su MSDN. (Non ho avuto il tempo di provare comunque.)