如何在抽象类的静态方法中获取当前类的类型(不是名称字符串,而是类型本身)?
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
}
}
这个问题与这个问题非常相似:
How to get the current class name at runtime?
但是,我想从静态方法中获取此信息。
答案 0 :(得分: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
}
}
只需将类型作为泛型类型参数传递给基类,即可从静态方法访问派生类型。
答案 1 :(得分:1)
我认为您必须像其他建议一样传递它或者创建一个堆栈帧,我相信如果你将整个堆栈跟踪放在一起虽然它可能很昂贵。
请参阅http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx
答案 2 :(得分: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"
}
}
答案 3 :(得分: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());
}
}