动态生成的类,该类实现了ienumerator getEnumerator()和ienumerator ienumerable.getEnumerator()

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

我有反射的问题。我想动态创建的类,它可以简单地实现Icollection。我定义的所有方法都很好,而不是接下来的两个:public ienumerator getEnumerator()&ienumerator ienumerabter.getEnumerator()下一个代码显示我想在我的动态类中显示的内容:

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

    IEnumerator IEnumerable.GetEnumerator()
    {...}

}

该反射器的输出打开了我的动态组件:

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

答案是该方法的下一个定义

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

令我惊讶的是,用该方法的名称编写接口名称是建立与界面的唯一关系

其他提示

看来您应该使用 DefineMethod 而不是 DefineMethodOverride. 。有 发出显式接口实现的示例 在MSDN上。 (但是我没有花时间尝试。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top