clase generada dinámicamente que implementa IEnumerator GetEnumerator () y IEnumerator IEnumerable.GetEnumerator ()

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

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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top