3

抽象クラスの静的メソッドで、現在のクラスの型 (名前文字列ではなく、型自体) を取得するにはどうすればよいですか?

using System.Reflection; // I'll need it, right?

public abstract class AbstractClass {

    private static void Method() {

        // I want to get CurrentClass type here

    }

}

public class CurrentClass : AbstractClass {

    public void DoStuff() {

        Method(); // Here I'm calling it

    }

}

この質問は、次の質問と非常によく似ています。

実行時に現在のクラス名を取得するには?

ただし、静的メソッド内からこの情報を取得したいと考えています。

4

4 に答える 4

3
public abstract class AbstractClass
{
    protected static void Method<T>() where T : AbstractClass
    {
        Type t = typeof (T);

    }
}

public class CurrentClass : AbstractClass
{

    public void DoStuff()
    {
        Method<CurrentClass>(); // Here I'm calling it
    }

}

型をジェネリック型引数として基本クラスに渡すだけで、静的メソッドから派生型にアクセスできます。

于 2013-04-20T13:19:20.017 に答える
1

この静的メソッドを派生クラスからのみ呼び出す場合は、「System.Diagnostics.StackTrace」のように使用できます

abstract class A
{
    public abstract string F();
    protected static string S()
    {
        var st = new StackTrace();
        // this is what you are asking for
        var callingType = st.GetFrame(1).GetMethod().DeclaringType;
        return callingType.Name;
    }
}

class B : A
{
    public override string F()
    {
        return S(); // returns "B"
    }
}

class C : A
{
    public override string F()
    {
        return S();  // returns "C"
    }
}
于 2013-04-20T13:32:21.930 に答える
1

他の提案のように渡すか、スタック フレームを作成する必要があると思います。スタック トレース全体をまとめれば、コストがかかる可能性があると思います。

http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspxを参照してください。

于 2013-04-20T13:25:29.870 に答える
0

static型を渡さずに呼び出す場合、メソッドはできません。あなたはこれを行うことができます:

public abstract class AbstractClass {
    protected void Method() {
        var t = GetType(); // it's CurrentClass
    }
}

コンテキストからもアクセスできるようにする必要がある場合staticは、オーバーロード、さらにはジェネリック オーバーロードを追加できます。

public abstract class AbstractClass {
    protected static void Method<T>() {
        Method(typeof(T));
    }
    protected static void Method(Type t) {
        // put your logic here
    }
    protected void Method() {
        Method(GetType());
    }
}
于 2013-04-20T13:26:16.737 に答える