iEnumerator getEnumerator()およびiEnumerator ienumerable.getEnumerator()を実装する動的に生成されたクラス
-
08-10-2019 - |
質問
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#でそれを書くのに問題があったからです。誰かが私を助けることができますか?
解決 2
回答は次にメソッドを定義します
MethodBuilder myMethod = myType.DefineMethod("System.Collections.IEnumerable.GetEnumerator",
MethodAttributes.Private | MethodAttributes.HideBySig |
MethodAttributes.NewSlot | MethodAttributes.Virtual |
MethodAttributes.Final);
メソッドの名前でインターフェイス名を書くことは、インターフェイスとのユニークな関係を確立することであることは驚くべきことでした
他のヒント
おそらく使用すべきだと思われます DefineMethod
それよりも DefineMethodOverride
. 。がある 明示的なインターフェイスの実装を放出する例 MSDNで。 (私はそれを試すのに時間をかけていません。)
所属していません StackOverflow