4

呼び出された基本クラスの静的メソッド内で呼び出し元の派生クラスを取得することが (リフレクションなどを介しても) 可能かどうか疑問に思っていました。

たとえば、静的メソッドが定義された基本クラスがあります。

public MyBaseClass {
    public static void MyBaseClassStaticMethod() { /** ... **/ }
}

およびそれから派生したクラス:

public MyDerivedClass : MyBaseClass { }

それから私は電話します:

MyDerivedClass.MyBaseClassStaticMethod()

method 内で、呼び出し元の派生型MyBaseClassStaticMethodを知ることは可能ですか? (つまり)
MyDerivedClass

紐だけ欲しい…

4

4 に答える 4

6

次の方法のジェネリックを使用して、シナリオを解決できます

public class BaseClass<TDerived> where TDerived : BaseClass<TDerived>
{
    public static void LogCallerType()
    {
        Console.WriteLine(typeof(TDerived).Name);
    }
}

public class FooClass : BaseClass<FooClass> { }

public class BooClass : BaseClass<BooClass> { }

class Program
{
    static void Main(string[] args)
    {
        FooClass.LogCallerType();
        BooClass.LogCallerType();
    }
}

これにより、次のように出力されます

1. FooClass
2. BooClass
于 2014-03-20T12:03:17.817 に答える
5

いいえ、これは不可能です。staticメソッドは多態的ではないため、この情報は単に存在しません。
コードの再設計を検討してください。

アップデート:

コンパイル時に、コンパイラはMyDerivedClass静的メソッドが実際に宣言されているクラスに置き換えますMyBaseClass
そのため、IL でも表示されませんMyDerivedClass。この情報は、ソース コードにのみ存在します。コンパイルされたアセンブリには存在しません。

于 2013-04-30T14:08:08.317 に答える
-1

まず、静的メソッドはそれを呼び出しているインスタンスにアクセスできません。静的メソッドは、クラス インスタンスへの「this」参照にアクセスできないという点で、通常のクラス メソッドとは異なります。

「this」をパラメーターとして静的メソッドに渡した場合は、次のようにキャストできます。テストしたい多くの派生クラスがあるとします。

public static void MyBaseClassStaticMethod(MyBaseClass callingInstance)
{
    MyDerivedClass myDerivedClass = callingInstance as MyDerivedClass;
    MyDerivedClass2 myDerivedClass2 = callingInstance as MyDerivedClass2;
    MyDerivedClass3 myDerivedClass3 = callingInstance as MyDefivedClass3;
    ...

    // test for which derived class is calling
    if (myDerivedClass != null)
        ...
    else if (myDerivedClass2 != null)
        ...

    ...
}
于 2013-04-30T14:16:58.120 に答える