C # nhận tên lớp riêng của mình


464

Nếu tôi có một lớp được gọi MyProgram, có cách nào để lấy " MyProgram " dưới dạng chuỗi không?

Câu trả lời:


743

Thử cái này:

this.GetType().Name

36
Nếu bạn đang ở trong một phương thức tĩnh thì nhà phát triển sẽ biết tên của loại đó là gì. Bạn chỉ có thể nhập nó dưới dạng một chuỗi trong mã nguồn.
Eric Lippert

122
@EricLippert: Nếu bạn nhập tên vào, trình biên dịch sẽ không bắt được nếu lớp được đổi tên.
Halvard

12
@Halvard: Đầu tiên, nếu phương thức tĩnh thuộc loại hiện tại thì tên là tùy chọn; nếu bạn lo lắng về việc nó thay đổi, hãy bỏ qua nó. Thứ hai, Visual Studio sẽ tự động cung cấp cho bạn một thẻ thông minh khi bạn đổi tên một lớp đổi tên tất cả các phiên bản của nó. Và thứ ba, nếu bạn đổi tên một lớp thì tỷ lệ cược là tốt, bạn sẽ phải thực hiện nhiều thay đổi ở nhiều nơi.
Eric Lippert

12
@EricLippert Bạn nói đúng. Bất kỳ phiên bản mới nào của Visual Studio hoặc ReSharper đều sẽ bắt được các chuỗi có cùng tên với lớp được đổi tên. Nhận xét trước đây của tôi chỉ là một số kiến ​​thức cũ, bây giờ vô dụng ...
Halvard 15/03/13

17
@Halvard: ... và trong C # 6, bạn có thể sử dụng nameoftoán tử mới .
Eric Lippert

238

Tôi muốn ném nó lên cho biện pháp tốt. Tôi nghĩ rằng cách @micahtan được đăng là ưa thích.

typeof(MyProgram).Name

24
Điều này thực sự tốt hơn, bởi vì: 1. Nó sẽ hoạt động trong bối cảnh tĩnh 2. Đó là thời gian biên dịch được tính toán, vì vậy nó không tốn kém như sự phản chiếu
Gilbert

6
@JimBalter Nó có nhiều ưu điểm: 1. Bối cảnh tĩnh. 2. Phần loại sẽ không được đánh giá lại bởi CLR mỗi lần - nó sẽ được ghi vào MSIL. 3. Nó bảo vệ bạn khỏi ai đó khai báo "GetType ()" mới.
Gilbert

11
Nếu bạn muốn có được tên lớp kế thừa và cuộc gọi này là cha mẹ thì nó sẽ không hoạt động.
Gh61

10
Điều này có nhược điểm là phải tham chiếu loại một cách rõ ràng, làm cho nó ít dễ dàng sử dụng lại.
cprcrack 16/2/2015

20
Trong C # 6.0 trở lên bạn có thể làm được nameof(MyProgram).
Owen Johnson

190

Với C # 6.0, bạn có thể sử dụng nameoftoán tử:

nameof(MyProgram)

4
Công cụ tuyệt vời; cũng hoạt động với các thành viên loại (như phương thức và thuộc tính) và thậm chí các biến - xem tài liệu .
mkuity0

127

Mặc dù câu trả lời của micahtan là tốt, nhưng nó sẽ không hoạt động theo phương pháp tĩnh. Nếu bạn muốn lấy tên của loại hiện tại, loại này sẽ hoạt động ở mọi nơi:

string className = MethodBase.GetCurrentMethod().DeclaringType.Name;

2
Bắt tốt, mặc dù tôi nghĩ rằng phương pháp của tôi được ưa thích trong trường hợp này.
ChaosPandion

5
Điều này sẽ không hoạt động đối với các phương thức không ảo, vì nó sẽ trả về tên của loại phương thức được khai báo và triển khai, (có thể là lên chuỗi thừa kế), chứ không phải kiểu cụ thể của trường hợp bạn đang thực thi mã từ.
Charles Bretana

1
Điều này dường như không còn hoạt động nữa trong khung DNX (Dot Net Execut). Họ đã loại bỏ phương thức GetCienMethod () và chỉ còn lại GetMethodFromHandle ().
Astaar

Đây chính xác là những gì tôi cần để có được tên của lớp cụ thể hiện đang thực thi mã được gọi từ một hàm ảo trong một hậu duệ.
DrFloyd5

15

Để tham khảo, nếu bạn có một loại kế thừa từ loại khác, bạn cũng có thể sử dụng

this.GetType().BaseType.Name

12

Nếu bạn cần điều này trong các lớp dẫn xuất, bạn có thể đặt mã đó vào lớp cơ sở:

protected string GetThisClassName() { return this.GetType().Name; }

Sau đó, bạn có thể đạt được tên trong lớp dẫn xuất. Trả về tên lớp dẫn xuất. Tất nhiên, khi sử dụng từ khóa "nameof" mới, sẽ không có nhu cầu như hành vi đa dạng này.

Ngoài ra bạn có thể định nghĩa điều này:

public static class Extension
{
    public static string NameOf(this object o)
    {
        return o.GetType().Name;
    }
}

Và sau đó sử dụng như thế này:

public class MyProgram
{
    string thisClassName;

    public MyProgram()
    {
        this.thisClassName = this.NameOf();
    }
}

10

Dùng cái này

Giả sử Application Test.exe đang chạy và hàm là foo () trong form1 [về cơ bản nó là lớp form1 ], sau đó đoạn mã trên sẽ tạo ra phản hồi bên dưới.

string s1 = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name;

Điều này sẽ trở lại.

s1 = "TEST.form1"

cho tên chức năng:

string s1 = System.Reflection.MethodBase.GetCurrentMethod().Name;

sẽ trở lại

s1 = foo 

Lưu ý nếu bạn muốn sử dụng điều này trong sử dụng ngoại lệ:

catch (Exception ex)
{

    MessageBox.Show(ex.StackTrace );

}

DeclaringType được khai báo [Nullable(2)]để bạn nhận được cảnh báo khi kiểm tra null được kích hoạt.
Martin

@Martin, hãy giải thích bình luận của bạn. Tôi không hiểu sao?
NoChance

2

thiscó thể được bỏ qua. Tất cả bạn cần để có được tên lớp hiện tại là:

GetType().Name

2

Nhận tên lớp hiện tại của Asp.net

string CurrentClass = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name.ToString();

1
DeclaringType được khai báo [Nullable(2)]để bạn nhận được cảnh báo khi kiểm tra null được kích hoạt.
Martin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.