关于C#:实现IEnumerator<t>GetEnumerator()和IEnumerator IEnumerable.GetEnumerator()的动态生成类

Dynamically generated class that implements IEnumerator<T> GetEnumerator() and IEnumerator IEnumerable.GetEnumerator()

我的反射有问题。发射。我想动态地创建类,它具有ICollection的简单实现。我定义的所有方法都很好,而不是接下来的两个方法:public IEnumerator GetEnumerator()&;IEnumerator IEnumerable.GetEnumerator())下一个代码显示了我想在动态类中成为什么样的人:

1
2
3
4
5
6
7
8
9
public class SomeClassThatIsIEnumerable<T> : IEnumerable<T>
{
    public IEnumerator<T> GetEnumerator()
    {...}

    IEnumerator IEnumerable.GetEnumerator()
    {...}

}

这一个是从反射镜输出打开我的动态组件:

1
2
3
4
5
6
7
8
9
10
11
12
public class SomeClassThatIsIEnumerable<T> : IEnumerable<T>
    {
        public IEnumerator<T> GetEnumerator()
        {
           ...
        }

        IEnumerator GetEnumerator()
        {
           ...
        }
    }

我的课程定义如下:

1
2
3
4
5
6
7
8
9
10
11
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上发出显式接口实现的示例。(但是我没有花时间去尝试。)


答案是方法的下一个定义

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

对我来说,以方法的名义编写一个接口名称将是与接口建立一个独特的关系,这真是令人惊讶。