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 回答