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:中也没有。有人能帮我吗?
似乎您应该使用
答案是方法的下一个定义
1 2 3 4 | MethodBuilder myMethod = myType.DefineMethod("System.Collections.IEnumerable.GetEnumerator", MethodAttributes.Private | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual | MethodAttributes.Final); |
对我来说,以方法的名义编写一个接口名称将是与接口建立一个独特的关系,这真是令人惊讶。