classe qui implémente générée dynamiquement IEnumerator GetEnumerator () et IEnumerator IEnumerable.GetEnumerator ()

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

Question

J'ai un problème avec Reflection.Emit. Je veux avoir la classe créée dynamiquement, qui a mise en oeuvre simple de ICollection. Toutes les méthodes que j'ai bien défini, au lieu de deux prochaines: IEnumerator publique GetEnumerator () et () IEnumerator IEnumerable.GetEnumerator le code suivant montre ce que je veux être dans ma classe dynamique:

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

    IEnumerator IEnumerable.GetEnumerator()
    {...}

}

Celui-ci est sortie du réflecteur ouvert mon montage dynamique:

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

        IEnumerator GetEnumerator()
        {
           ...
        }
    }

Je définir ma classe Dans ce sens:

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

quand je l'appelle myType.CreateType TypeLoadException lancers francs avec la méthode message GetEnumerator n'a pas mise en œuvre. Je suggère le problème avec la méthode IEnumerable.GetEnumerator, parce que j'avais des problèmes par écrit sur C #, pas même dans IL :). Quelqu'un peut-il m'aider?

Était-ce utile?

La solution 2

Réponse définir la méthode suivante

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

Il me était incroyable que écrire un nom d'interface au nom de la méthode serait d'établir une relation unique avec l'interface

Autres conseils

Il semble que vous devriez peut-être en utilisant DefineMethod plutôt que DefineMethodOverride. Il est un exemple d'émettre une implémentation d'interface explicite sur MSDN. (Je ne l'ai pas pris le temps d'essayer cependant.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top