2011-07-21 20 views
6

Ví dụ:C# lấy classname trong một phương pháp tĩnh

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

Dù sao, tôi muốn nó trở về "MyProgram.Testing.Test2" mà thay vào đó Test2.GetInheritedClassName() trả về "MyProgram.Testing.Test1". Tôi phải làm gì để đưa vào lớp tĩnh đó để làm cho nó trở lại (nếu có thể)?

+0

Tôi không nghĩ điều này là có thể, các thành viên tĩnh luôn luôn sống trên lớp cơ sở đã xác định chúng. Nhưng tôi chắc rằng người khác có thể cung cấp câu trả lời kỹ thuật hơn. – CodingGorilla

Trả lời

1

Mã đang in ra là loại phương thức cơ sở. Ngoại trừ các trường hợp Reflection hiếm gặp như bạn cung cấp ở trên, việc thực hiện sẽ không bị ảnh hưởng bởi liệu phương thức được gọi là sử dụng kiểu dẫn xuất hay kiểu cơ sở, do đó hệ thống không phân biệt.

Bạn có thể, tuy nhiên, làm được việc này bằng cách định nghĩa một loại cơ sở chung:

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

và sau đó xác định các loại khác quan tâm:

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

Người ta có thể sau đó nếu muốn xác định các lớp lá :

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

Một lưu ý nhỏ ở đây là ClassNameTester2 có nguồn gốc từ bên trong m ClassNameTester1 <T> nhưng không thay thế được cho bất kỳ điều gì phải làm với ClassNameTester1 <ClassNameTester1>; nếu nó đang được sử dụng như một lớp tĩnh, tuy nhiên, đó không phải là một vấn đề.

6

Không thể thực hiện được. Khi bạn gọi Test2.GetInheritedClassName, nó thực sự Test1.GetInheritedClassName đó được gọi là, bởi vì Test2.GetInheritedClassName không thực sự tồn tại (btw, một số công cụ như Resharper sẽ hiển thị một cảnh báo: Tiếp cận một thành viên tĩnh của một loại thông qua một loại có nguồn gốc)

Các thành viên tĩnh không tham gia vào thừa kế, mà là loại hợp lý kể từ khi thừa kế chỉ có ý nghĩa khi bạn đang xử lý các cá thể ...

Các vấn đề liên quan