Reflection.Emitに問題があります。ICollectionの実装が簡単な動的に作成されたクラスが必要です。次の2つではなく、私がうまく定義したすべてのメソッド:public IEnumerator GetEnumerator()&IEnumerator IEnumerable.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メソッドの問題について提案しています。これは、ILでも、C#での記述に問題があったためです:)。誰か助けてもらえますか?