Classe generato dinamicamente che implementa IEnumerator GetEnumerator () e IEnumerator IEnumerable.GetEnumerator ()

StackOverflow https://stackoverflow.com/questions/4162736

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?

È stato utile?

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.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top