gpt4 book ai didi

c# - 实现 IEnumerator GetEnumerator() 和 IEnumerator IEnumerable.GetEnumerator() 的动态生成的类

转载 作者:行者123 更新时间:2023-11-30 12:17:07 28 4
gpt4 key购买 nike

我对 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。有 an example of emitting an explicit interface implementation在 MSDN 上。 (不过我还没有花时间去尝试。)

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com