我对Reflection.Emit有问题。我想动态创建一个类,该类具有ICollection的简单实现。我定义的所有方法都不错,而不是接下来的两个:public IEnumerator GetEnumerator()和IEnumerator IEnumerable.GetEnumerator()
下一段代码显示了我想在动态类中显示的内容:

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

    IEnumerator IEnumerable.GetEnumerator()
    {...}

}

这是从Reflector输出中打开我的动态程序集的:
public class SomeClassThatIsIEnumerable<T> : IEnumerable<T>
    {
        public IEnumerator<T> GetEnumerator()
        {
           ...
        }

        IEnumerator GetEnumerator()
        {
           ...
        }
    }

我以这种方式定义我的类(class):
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

当我调用myType.CreateType时,TypeLoadException与消息一起抛出GetEnumerator方法没有实现。我建议使用IEnumerable.GetEnumerator方法的问题,因为我在C#上甚至在IL :)上都遇到了问题。谁能帮我?

最佳答案

看来您应该使用DefineMethod而不是DefineMethodOverride。 MSDN上有an example of emitting an explicit interface implementation。 (不过,我还没有花时间尝试一下。)

关于c# - 动态生成的类,该类实现IEnumerator <T> GetEnumerator()和IEnumerator IEnumerable.GetEnumerator(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4162736/

10-11 12:27