C # 자체 클래스 이름 얻기


464

라는 클래스 MyProgram가 있으면 " MyProgram "을 문자열로 검색하는 방법이 있습니까?

답변:


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).
Owen Johnson

190

C # 6.0에서는 nameof연산자를 사용할 수 있습니다 .

nameof(MyProgram)

4
좋은 물건; 또한 메서드 및 속성과 같은 형식 멤버 및 변수와도 작동합니다 . docs를 참조하십시오 .
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 가 실행 중이고 form1 [기본적으로 form1 클래스 ] 에서 함수가 foo () 라고 가정 하면 위의 코드는 아래 응답을 생성합니다.

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)]null 확인이 활성화되면 경고가 표시되도록 DeclaringType이 선언 됩니다.
Martin

@Martin, 의견을 설명 해주십시오. 나는 그것을 얻지 못합니까?
NoChance

2

this생략 할 수 있습니다. 현재 클래스 이름을 얻는 데 필요한 것은 다음과 같습니다.

GetType().Name

2

Asp.net의 현재 클래스 이름 가져 오기

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

1
[Nullable(2)]null 확인이 활성화되면 경고가 표시되도록 DeclaringType이 선언 됩니다.
Martin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.