iEnumerator getEnumerator()およびiEnumerator ienumerable.getEnumerator()を実装する動的に生成されたクラス

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

質問

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で。 (私はそれを試すのに時間をかけていません。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top