动态生成的类,实现IEnumerator <t> GetEnumerator()和IEnumerator IEnumerable.GetEnumerator()</t>

时间:2010-11-12 08:16:55

标签: c# ienumerable reflection.emit ienumerator

我对Reflection.Emit有疑问。我想拥有动态创建的类,它具有ICollection的简单实现。我定义的所有方法都很好,而不是下两个:public IEnumerator GetEnumerator()&amp; 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()
        {
           ...
        }
    }

我以这种方式定义我的课程:

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 :)中都没有。谁能帮我?

2 个答案:

答案 0 :(得分:2)

您似乎应该使用DefineMethod而不是DefineMethodOverride。 MSDN上有an example of emitting an explicit interface implementation。 (但我没有花时间尝试它。)

答案 1 :(得分:1)

答案是方法的下一个定义

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

令我惊讶的是,在方法名称中编写接口名称将与接口建立唯一关系