2011-07-21 12 views
6

Örnek: NeyseC# alınıyor Sınıfadı

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(); 
    } 
} 

, bunu "MyProgram.Testing.Test2" ancak bunun yerine Test2.GetInheritedClassName() "MyProgram.Testing.Test1" döndürür dönmek istiyorum. Bunu yapmak için (eğer mümkünse) o durağan sınıfa koymak zorundayım?

+0

Bunun mümkün olduğunu düşünmüyorum, statik üyeler her zaman bunları tanımlayan temel sınıfta yaşıyorlar. Ama eminim başka biri daha teknik bir cevap verebilir. – CodingGorilla

cevap

1

Türü basan kod, temel sınıf yöntemidir. Yukarıda sağladığınız gibi, nadir Yansıma senaryoları dışında, yöntem türetilmiş tür veya taban türünü kullanarak yöntemin çağrılıp çağrılmadığından etkilenmez, dolayısıyla sistem hiçbir ayrım yapmaz.

Ancak, genel bir baz türü tanımlayarak bu çevrede alabilir: ilgi diğer türleri

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

ve sonra tanımlayan:

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

biri daha sonra yaprak sınıflarını tanımlamak istenirse en : burada

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

biri hafif ihtar ClassNameTester2 fro onun bağırsaklar türemiştir olmasıdır m ClassNameTester1 <T> ancak ClassNameTester1 <ClassNameTester1> ile ilgili herhangi bir şey için ikame edilemez; eğer statik bir sınıf olarak kullanılıyorsa, bu bir problem olmamalı.

6

Bu mümkün değil. Eğer Test2.GetInheritedClassName çağırdığınızda, Test2.GetInheritedClassName gerçekten var çünkü aslında denir Test1.GetInheritedClassName var:

(Btw resharper gibi bazı araçlar bir uyarı gösterecek türetilmiş bir tür üzerinden bir türde bir statik üyesine Erişimi) Statik üyeler mirasa katılmazlar, bu da mirastan bu yana mantıklıdır, çünkü örneklerle uğraşırken sadece mantıklıdır ...