C # รับชื่อคลาสของตัวเอง


คำตอบ:


743

ลองสิ่งนี้:

this.GetType().Name

36
หากคุณใช้วิธีการคงที่นักพัฒนาซอฟต์แวร์จะทราบชื่อของประเภทนั้น คุณสามารถพิมพ์เป็นสตริงในซอร์สโค้ดได้
Eric Lippert

122
@EricLippert: หากคุณพิมพ์ชื่อคอมไพเลอร์จะไม่ตรวจสอบหากมีการเปลี่ยนชื่อชั้นเรียน
Halvard

12
@ Halvard: ก่อนอื่นหากวิธีการคงที่อยู่ในประเภทปัจจุบันแล้วชื่อเป็นตัวเลือก; หากคุณกังวลว่ามันจะเปลี่ยนไป ประการที่สอง Visual Studio จะให้สมาร์ทแท็กแก่คุณโดยอัตโนมัติเมื่อคุณเปลี่ยนชื่อคลาสที่เปลี่ยนชื่ออินสแตนซ์ทั้งหมดของมัน และประการที่สามหากคุณเปลี่ยนชื่อชั้นเรียนอัตราต่อรองเป็นสิ่งที่ดีคุณจะต้องทำการเปลี่ยนแปลงมากมายในหลาย ๆ ที่แล้ว
Eric Lippert

12
@EricLippert คุณพูดถูก Visual Studio หรือ ReSharper รุ่นใหม่ใด ๆจะตรวจจับสตริงที่มีชื่อเดียวกันกับคลาสที่ถูกเปลี่ยนชื่อ ความคิดเห็นก่อนหน้านี้ของฉันเก่าไปบางตอนความรู้ที่ไร้ประโยชน์ ...
Halvard

17
@Halvard: ... และใน C # 6 คุณสามารถใช้nameofโอเปอเรเตอร์ใหม่ได้
Eric Lippert

238

ฉันต้องการที่จะโยนสิ่งนี้ให้ดี ฉันคิดว่าวิธีที่@micahtanเป็นที่ต้องการ

typeof(MyProgram).Name

24
มันดีกว่าจริง ๆ เพราะ: 1. มันจะทำงานในบริบทที่คงที่ 2. มันเป็นเวลาที่คอมไพล์แล้วดังนั้นมันจึงไม่เสียค่าใช้จ่ายในการสะท้อน
Gilbert

6
@JimBalter มันมีข้อดีหลายประการ: 1. บริบทแบบคงที่ 2. ส่วนประเภทจะไม่ได้รับการประเมินอีกครั้งโดย CLR ในแต่ละครั้ง - มันจะถูกเขียนไปยัง MSIL 3. ช่วยปกป้องคุณจากบางคนที่ประกาศ "GetType ()" ใหม่
Gilbert

11
หากคุณต้องการรับชื่อคลาสที่สืบทอดมาและการโทรนี้อยู่ในพาเรนต์จะไม่ทำงาน
Gh61

10
สิ่งนี้มีข้อเสียของการอ้างอิงประเภทอย่างชัดเจนซึ่งทำให้ไม่สามารถใช้ซ้ำได้ง่าย
cprcrack

20
ใน C # 6.0 nameof(MyProgram)หรือใหม่กว่าที่คุณสามารถทำได้
โอเว่นจอห์นสัน

190

ด้วย C # 6.0 คุณสามารถใช้nameofโอเปอเรเตอร์:

nameof(MyProgram)

4
สิ่งที่ยอดเยี่ยม; ยังทำงานร่วมกับประเภทของสมาชิก (เช่นวิธีการและคุณสมบัติ) และตัวแปรแม้ - ดูเอกสาร
mklement0

127

แม้ว่าคำตอบของ micahtan นั้นดี แต่มันจะไม่ทำงานในวิธีการคงที่ หากคุณต้องการดึงชื่อของประเภทปัจจุบันอันนี้ควรทำงานได้ทุกที่:

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

2
เยี่ยมมากแม้ว่าฉันคิดว่าวิธีการของฉันเป็นที่ต้องการในกรณีนี้
ChaosPandion

5
สิ่งนี้จะไม่ทำงานสำหรับวิธีที่ไม่ใช่แบบเสมือนเนื่องจากจะส่งคืนชื่อของชนิดที่มีการประกาศและนำวิธีการนั้นมาใช้ (อาจเป็นไปตามสายโซ่การสืบทอด) ไม่ใช่ประเภทที่เป็นรูปธรรมของอินสแตนซ์ที่คุณกำลังเรียกใช้รหัส จาก.
Charles Bretana

1
ดูเหมือนจะไม่ทำงานอีกต่อไปในกรอบงาน DNX (Dot Net Execution) พวกเขาลบเมธอด GetCurrentMethod () และเหลือเพียง GetMethodFromHandle ()
Astaar

นี่คือสิ่งที่ฉันต้องการเพื่อรับชื่อของคลาสคอนกรีตในปัจจุบันรันโค้ดที่เรียกว่าจากฟังก์ชั่นเสมือนจริงในลูกหลาน
DrFloyd5

15

สำหรับการอ้างอิงหากคุณมีประเภทที่สืบทอดจากที่อื่นคุณสามารถใช้

this.GetType().BaseType.Name

12

หากคุณต้องการสิ่งนี้ในคลาสที่ได้รับคุณสามารถใส่รหัสนั้นลงในคลาสพื้นฐานได้:

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

จากนั้นคุณสามารถเข้าถึงชื่อในคลาสที่ได้รับ ส่งคืนชื่อคลาสที่ได้รับ แน่นอนเมื่อใช้คำหลักใหม่ "nameof" ไม่จำเป็นต้องทำตัวหลากหลายเช่นนี้

นอกจากนี้คุณสามารถกำหนดสิ่งนี้:

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

แล้วใช้ดังนี้:

public class MyProgram
{
    string thisClassName;

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

10

ใช้สิ่งนี้

สมมติว่า Application Test.exeทำงานและฟังก์ชั่นคือfoo ()ในform1 [โดยทั่วไปคือclass form1 ] จากนั้นโค้ดด้านบนจะสร้างการตอบสนองด้านล่าง

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

สิ่งนี้จะกลับมา

s1 = "TEST.form1"

สำหรับชื่อฟังก์ชั่น:

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

จะกลับมา

s1 = foo 

หมายเหตุหากคุณต้องการใช้สิ่งนี้ยกเว้นการใช้:

catch (Exception ex)
{

    MessageBox.Show(ex.StackTrace );

}

ประกาศประเภทประกาศ[Nullable(2)]เพื่อให้คุณได้รับการเตือนเมื่อตรวจสอบเป็นโมฆะ
Martin

@ มาร์ตินโปรดอธิบายความคิดเห็นของคุณ ฉันไม่เข้าใจ
NoChance

2

thisสามารถละเว้นได้ สิ่งที่คุณต้องได้รับชื่อคลาสปัจจุบันคือ:

GetType().Name

2

รับชื่อคลาสปัจจุบันของ Asp.net

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

1
ประกาศประเภทประกาศ[Nullable(2)]เพื่อให้คุณได้รับการเตือนเมื่อตรวจสอบเป็นโมฆะ
Martin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.