2011-07-21 47 views
6

例子:C#類名檢索在靜態方法

namespace MyProgram.Testing 
{ 

    public class Test1 
    { 
     public void TestMethod() 
     { 
      String actualType = this.GetType().FullName.ToString(); 
      return; 
     } 

     public static String GetInheritedClassName() 
     { 
      return System.Reflection.MethodBase.GetCurrentMethod().ReflectedType.FullName; 
     } 

    } 

    public class Test2 : Test1 
    { 
    } 

    public class Test3 
    { 
     String test2ClassName = Test2.GetInheritedClassName(); 
    } 
} 

無論如何,我希望它返回 「MyProgram.Testing.Test2」,而是Test2.GetInheritedClassName()返回 「MyProgram.Testing.Test1」。我必須把這個靜態類放到哪裏才能返回(如果可能的話)?

+0

我不認爲這是可能的,靜態成員總是活在定義它們的基類上。但我相信別人可以提供更多技術性的答案。 – CodingGorilla

回答

1

打印出類型的代碼是基類方法。除了上面提供的罕見的Reflection方案之外,執行不受該方法是使用派生類型還是基類型調用,因此係統沒有區別。

你可以,但是,解決這個問題通過定義一個通用的基本類型:

 
    class ClassNameTesterBase<T>where T:ClassNameTester<T> 
    { 
     public static String getName() { return (typeof(T)).Name; } 
    } 

,然後定義其他類型的興趣:

 
    class ClassNameTester1<T> : ClassNameTesterBase<T> ... 
    class ClassNameTester2<T> : ClassNameTester1<T> ... 

之一,那麼可以,如果需要的定義葉類:

 
    class ClassNameTester1 : ClassNameTester1<ClassNameTester1> { } 
    class ClassNameTester2 : ClassNameTester2<ClassNameTester2> { } 

這裏的一個小問題是ClassNameTester2派生它的內部來自m ClassNameTester1 <T>但不能替代任何與ClassNameTester1 <ClassNameTester1>;如果它被用作靜態類,那應該不是問題。

6

這是不可能的。當你調用Test2.GetInheritedClassName,它實際上Test1.GetInheritedClassName被調用,因爲Test2.GetInheritedClassName並不真正存在:

(順便說一句,有些像ReSharper的工具會顯示警告通過派生類型訪問類型的靜態成員)靜態成員不參與繼承,這是合乎邏輯的,因爲繼承只在處理實例時纔有意義...