2011-07-21 20 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を呼び出すと、それはTest2.GetInheritedClassNameが本当に存在していないため、実際に呼び出されTest1.GetInheritedClassNameです:

(ところで、ReSharperのようないくつかのツールが警告を示すだろう派生型経由型の静的メンバへアクセス)静的メンバーは継承には参加しません。これは、継承がインスタンスを扱うときにのみ意味があるため論理的です...

関連する問題