clase generada dinámicamente que implementa IEnumerator GetEnumerator () y IEnumerator IEnumerable.GetEnumerator ()
-
08-10-2019 - |
Pregunta
Tengo un problema con Reflection.Emit. Quiero tener la clase de forma dinámica creada, que tiene la implementación sencilla de ICollection. Todos los métodos he definido bien, en lugar de dos siguientes: pública IEnumerator GetEnumerator () y () IEnumerator IEnumerable.GetEnumerator código próximos shows lo que yo quiero estar en mi clase dinámica:
public class SomeClassThatIsIEnumerable<T> : IEnumerable<T>
{
public IEnumerator<T> GetEnumerator()
{...}
IEnumerator IEnumerable.GetEnumerator()
{...}
}
Éste se emite desde el reflector me abrió la dinámica de montaje:
public class SomeClassThatIsIEnumerable<T> : IEnumerable<T>
{
public IEnumerator<T> GetEnumerator()
{
...
}
IEnumerator GetEnumerator()
{
...
}
}
estoy definiendo mi clase De tal manera:
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
cuando llamo myType.CreateType TypeLoadException tiros con el método GetEnumerator mensaje no tiene aplicación. Estoy sugiriendo el problema con el método IEnumerable.GetEnumerator, porque tenía problemas para escribir en C #, ni siquiera en IL :). ¿Alguien puede ayudarme?
Solución 2
respuesta está próxima a definir del método
MethodBuilder myMethod = myType.DefineMethod("System.Collections.IEnumerable.GetEnumerator",
MethodAttributes.Private | MethodAttributes.HideBySig |
MethodAttributes.NewSlot | MethodAttributes.Virtual |
MethodAttributes.Final);
Fue sorprendente para mí que escribir un nombre de interfaz en el nombre del método sería establecer una relación única con la interfaz
Otros consejos
Parece que tal vez debería utilizar DefineMethod
en lugar de DefineMethodOverride
. Hay un ejemplo de emitir una implementación de interfaz explícita en MSDN. (No he tomado el tiempo para probarlo sin embargo.)