Dynamisch generierte Klasse, die implementiert IEnumerator GetEnumerator () und IEnumerator IEnumerable.GetEnumerator ()

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

Frage

Ich habe ein Problem mit Reflection.Emit haben. Ich möchte dynamisch erstellte Klasse haben, die einfache Implementierung von ICollection hat. Alle Methoden, die ich fein definiert haben, statt nächsten zwei: public IEnumerator GetEnumerator () & IEnumerator IEnumerable.GetEnumerator () Weiter Code zeigt, was ich in meiner dynamischen Klasse sein will:

public class SomeClassThatIsIEnumerable<T> : IEnumerable<T>
{
    public IEnumerator<T> GetEnumerator()
    {...}

    IEnumerator IEnumerable.GetEnumerator()
    {...}

}

Dies wird von dem Reflektor meiner dynamischen geöffnet Montag:

public class SomeClassThatIsIEnumerable<T> : IEnumerable<T>
    {
        public IEnumerator<T> GetEnumerator()
        {
           ...
        }

        IEnumerator GetEnumerator()
        {
           ...
        }
    }

Ich bin die Definition meiner Klasse In einer solchen Art und Weise:

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

, wenn ich myType.CreateType Type nennen wirft mit der Meldung GetEnumerator Methode nicht Implementierung hat. Ich schlage auf Problem mit IEnumerable.GetEnumerator Methode, weil ich Probleme hatte es auf C #, nicht einmal in IL schriftlich zu :). Kann mir jemand helfen?

War es hilfreich?

Lösung 2

Die Antwort ist definiert neben der Methode

 MethodBuilder myMethod = myType.DefineMethod("System.Collections.IEnumerable.GetEnumerator",
                   MethodAttributes.Private | MethodAttributes.HideBySig |
                MethodAttributes.NewSlot | MethodAttributes.Virtual | 
                MethodAttributes.Final);

Es war mir erstaunlich, dass im Namen der Methode einen Schnittstellennamen zu schreiben wäre eine einzigartige Beziehung mit der Schnittstelle

zu etablieren

Andere Tipps

Es scheint, sollten Sie vielleicht lieber mit DefineMethod als DefineMethodOverride. Es gibt ein Beispiel für eine explizite Schnittstellenimplementierung emittierenden auf MSDN. (Ich habe nicht die Zeit genommen, es zu versuchen jedoch.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top