7

次の ILAsm コードがあるとします。

    .class public interface abstract ITest
    {
        .field public static int32 counter

        .method public static void StaticMethod(string str)
        {
            ldarg.0
            call void [mscorlib]System.Console::WriteLine(string)
            ret
        }

        .method public virtual abstract void InstMethod(string) { }
    }

ITestこのインターフェイスを実装するクラスを C# で定義することは可能ですか?

このインターフェイスを ILAsm に実装できます。

    .class public TestImpl extends [mscorlib]System.Object implements ITest
    {
        .method public virtual void InstMethod(string str)
        {
            ldarg.1
            call void ITest::StaticMethod(string)
            ret
        }

        .method public specialname rtspecialname instance void .ctor()
        {
            ldarg.0
            call instance void .base::.ctor()
            ret
        }
    }

C# コードで実装されたクラスを正常に使用します。

        var testImpl = new TestImpl();
        testImpl.InstMethod("I'm static!"); 

しかし、C# でこのインターフェイスを実装するにはどうすればよいでしょうか。

4

2 に答える 2

1

これは、次のようなコメントへの返信です。

リフレクション経由でも実装された静的を取得する方法がわかりません: var m = new Test().GetType().GetMethods(BindingFlags.Static | BindingFlags.Public); – user2341923

メソッドの宣言型はインターフェースであるため、インターフェース型からメソッド定義をプルする必要があることに注意してください。大まかに、これはうまくいくはずだと思います(追加されたいくつかのlinq拡張機能を使用)

var m = new Test().GetType().GetInterfaces().Where(
        i => i.IsAssignableFrom(
        typeof ITest)).First().GetMethods(
        BindingFlags.Static | BindingFlags.Public);

これは、インターフェイスの実装されたメンバーに当てはまります。インスタンスまたはその他。

于 2014-04-29T07:12:09.913 に答える