classe qui implémente générée dynamiquement IEnumerator GetEnumerator () et IEnumerator IEnumerable.GetEnumerator ()
-
08-10-2019 - |
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?
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.)