5

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#での記述に問題があったためです:)。誰か助けてもらえますか?

4

2 に答える 2

2

DefineMethodではなく、おそらく使用する必要があるようですDefineMethodOverride。MSDNに明示的なインターフェイスの実装を発行する例があります。(しかし、私はそれを試すのに時間がかかりませんでした。)

于 2010-11-12T10:27:00.643 に答える
1

答えはメソッドの次の定義です

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

メソッド名にインターフェース名を書くことで、インターフェースと一意の関係が成立することに驚きました。

于 2010-11-13T15:31:52.497 に答える