2012-11-09 67 views
2

如果我有一個從A繼承的類B和C,是否有比使用StackFrame的GetFileName()更簡單的方法(然後解析出ClassName.cs字符串)?獲取當前類名包括父類名?

如果我使用this.GetType()。名稱,它不會返回「A」當代碼在父類中執行。

示例代碼

namespace StackOverflow.Demos 
{ 
    class Program 
    { 
     public static void Main(string[] args) 
     { 
      B myClass = new C(); 
      string containingClassName = myClass.GetContainingClassName(); 
      Console.WriteLine(containingClassName); //should output StackOverflow.Demos.B 
      Console.ReadKey(); 
     } 
    } 

    public class A { public A() { } } 
    public class B : A { public B() { } } 
    public class C : B { public C() { } } 

} 
+4

很難理解你的問題沒有至少一個小例子。你能不能展示一個能夠實現你想要實現的東西的小代碼片段,並告訴我們輸出與你想要的不同? – dasblinkenlight

+0

對不起。如果「this」是B類型,而它在父A的構造函數中運行,我想獲得類名「A」。我見過的大多數問答代碼都希望它返回「B」...但我希望它返回「A」。 – user1279437

+0

我已經更新了我的答案,以反映您之後的情況(請參閱第一個答案)。可能比這更好的方法;現在有一個遊戲 - 但這是暫時的作品。 – JohnLBevan

回答

8
var yourType = GetType(); 
var baseType = yourType.BaseType; 

或者:

var currentTypeName = new StackFrame(1, false).GetMethod().DeclaringType.Name; 
+0

+1。 BaseType可能是OP應該尋找的... –

+0

嗨,Daniel,謝謝...但當線程在父A的構造函數中運行時,您發佈的替代代碼仍會返回「B」。 – user1279437

+0

@ user1279437你介意分享你的代碼嗎? –

1

我用myObject.GetType().FullName它返回類的完全限定名。對於您的情況,您可以使用myObject.GetType().BaseType.FullName

0

選項1 ::獲得 「容器」 類:

/**CODE**/ 

    public static void Main(string[] args) 
    { 
     B c = new C(); 
     Test(c); 
     Console.ReadKey(); 
    } 
    public static void Test(A a) { Console.WriteLine(typeof(A).ToString()); } 
    public static void Test(B b) { Console.WriteLine(typeof(B).ToString()); } 
    public static void Test(C c) { Console.WriteLine(typeof(C).ToString()); } 

/**OUTPUT**/ 

    StackOverflow.Demos.B 

選項2 ::獲得 「容器」 類:

/**CODE**/ 

    class Program 
    { 
     public static void Main(string[] args) 
     { 
      B myClass = new C(); 
      Console.WriteLine(myClass.GetContainerType()); //should output StackOverflow.Demos.B 
      Console.ReadKey(); 
     } 
    } 

    public interface IGetContainerType 
    { 
     Type GetContainerType(); 
    } 

    public class A: IGetContainerType 
    { 
     public A() { } 
     public Type GetContainerType() 
     { 
      return typeof(A); 
     } 
    } 
    public class B : A 
    { 
     public B() { } 
     public new Type GetContainerType() 
     { 
      return typeof(B); 
     } 
    } 
    public class C : B 
    { 
     public C() { } 
     public new Type GetContainerType() 
     { 
      return typeof(C); 
     } 
    } 

/**OUTPUT**/ 

    StackOverflow.Demos.B 

對類似但不同的問題的回答;獲取的實例類/完整的層次:

/**CODE**/ 

    class Program 
    { 

     public static void Main(string[] args) 
     { 
      C c = new C(); 
      Type myType = c.GetType(); 
      while(myType != null) 
      { 
       Console.WriteLine(myType); 
       myType = myType.BaseType; 
      } 
      Console.ReadKey(); 
     } 
    } 


/**OUTPUT**/ 

    StackOverflow.Demos.C 
    StackOverflow.Demos.B 
    StackOverflow.Demos.A 
    System.Object 
0

當你說:GetType(),或等價this.GetType(),你得到的實際類型的類。例如

class A 
{ 
    public void Test() 
    { 
    Console.WriteLine(GetType().Name); 
    } 
} 

class B : A 
{ 
} 

及更高版本:

var myB = new B(); 
myB.Test(); // writes B to the console 

我想這就是polymorphism是怎麼一回事。

如果你想永遠A,沒有多態性,簡單地說:

class A 
{ 
    public void Test() 
    { 
    Console.WriteLine(typeof(A).Name); 
    } 
} 

class B : A 
{ 
}