전체 네임 스페이스없이 유형 이름 가져 오기


293

다음 코드가 있습니다.

return "[Inserted new " + typeof(T).ToString() + "]";

그러나

 typeof(T).ToString()

네임 스페이스를 포함한 전체 이름을 반환

어쨌든 클래스 이름을 얻는 방법이 있습니까 (네임 스페이스 한정자가 없습니까?)


7
또한 쓰기 string1 + anything.ToString() + string2는 중복됩니다. 그렇게하면 컴파일러가 ToString자동으로 호출을 삽입합니다 string1 + anything + string2.
Tim Robinson

13
가혹하게 들리지는 않지만 Type인스턴스에서 사용할 수있는 속성을 검사 했습니까 (에서 반환 typeof(..))이 문제를 직접 파악할 수있을 것입니다 ...
Peter Lillevold

답변:


530
typeof(T).Name // class name, no namespace
typeof(T).FullName // namespace and class name
typeof(T).Namespace // namespace, no class name

5
Name유형 매개 변수를 고려하지 않습니다.
gregsdennis 2016 년

73
또는 this.GetType().Name, this.GetType().FullName등을 인스턴스를 처리합니다.
avenmore

1
Name또한 중첩 유형을 고려하지 않습니다!
Warlike Chimpanzee

33

일반 유형에 대한 유형 매개 변수를 얻으려면 다음을 시도하십시오.

public static string CSharpName(this Type type)
{
    var sb = new StringBuilder();
    var name = type.Name;
    if (!type.IsGenericType) return name;
    sb.Append(name.Substring(0, name.IndexOf('`')));
    sb.Append("<");
    sb.Append(string.Join(", ", type.GetGenericArguments()
                                    .Select(t => t.CSharpName())));
    sb.Append(">");
    return sb.ToString();
}

아마도 재귀로 인해 가장 좋은 해결책은 아니지만 작동합니다. 출력은 다음과 같습니다.

Dictionary<String, Object>

3
재귀 할 수있는 제네릭 형식 (예 : Dictionary <int?, int?>)을 적절하게 고려하기 때문에 이는 허용되는 대답이어야합니다.
Otis

컨셉트 +1 그러나 실패한 조기 최적화를 싫어하십시오. 각 재귀 호출마다 새로 작성 StringBuilder되지만 (사용하지 않는 기본 사례 일지라도) string.Join임시 및 LINQ 람다 는 무시합니다 . 그냥 사용 String당신이 할 때까지 알 수 는 병목 현상입니다. / rant
Nigel Touch

1
나이젤, 그것의 최고의 솔루션 : 아마 것을 바로 말한다
gregsdennis

ShortName은 짧은 이름입니다 :)
Valera



5

C # 6.0 (포함) 후에는 nameof expression을 사용할 수 있습니다 .

using Stuff = Some.Cool.Functionality  
class C {  
    static int Method1 (string x, int y) {}  
    static int Method1 (string x, string y) {}  
    int Method2 (int z) {}  
    string f<T>() => nameof(T);  
}  

var c = new C()  

nameof(C) -> "C"  
nameof(C.Method1) -> "Method1"   
nameof(C.Method2) -> "Method2"  
nameof(c.Method1) -> "Method1"   
nameof(c.Method2) -> "Method2"  
nameof(z) -> "z" // inside of Method2 ok, inside Method1 is a compiler error  
nameof(Stuff) = "Stuff"  
nameof(T) -> "T" // works inside of method but not in attributes on the method  
nameof(f) -> f  
nameof(f<T>) -> syntax error  
nameof(f<>) -> syntax error  
nameof(Method2()) -> error This expression does not have a name  

노트! nameof기본 객체의 런타임 유형을 얻지 말고 컴파일 타임 인수입니다. 메소드가 IEnumerable을 허용하면 nameof는 단순히 "IEnumerable"을 리턴하지만 실제 오브젝트는 "List"일 수 있습니다.


3
nameofType
Nigel Touch

제가 확인했습니다 @NigelTouch와 nameof의 이름을 반환 Type증거와 함께 스크린 샷 : prntscr.com/irfk2c
스타스 Boyarincev

1
미안, 나는 잘 설명하지 않았다. 내 말은 기본 객체의 런타임을 얻지 못하고 Type컴파일 타임 인수 일뿐입니다. 방법이를 수락하면 IEnumerable다음 nameof실제 객체가 될 수있는 반면 단순히 "목록 <문자열>", "는 IEnumerable"를 반환합니다. OP의 질문에 대답한다고 생각하지 않습니다.
Nigel Touch

-2

가장 좋은 방법 :

obj.GetType().BaseType.Name

1
다른 사용자가 더 명확하게 답변 할 수 있도록 답변에 대한 설명을 제공해주십시오.
Stanislav Mekhonoshin

한 번은 "GetType (). Name"을 가상 함수 안에 작성했습니다. 누군가 왜 obj.GetType (). BaseType.Name이 없는지 설명 할 수 있습니까? 나는 배우고있다. 구문 세부 사항을 모두 이해하지는 않지만 목적을 이해합니다. 감사합니다.
Diego Orellana

기본 유형은 이것과 어떤 관련이 있습니까?
johnny 5

내 테스트 obj.GetType().BaseType.Name"TypeInfo"예상대로 원하는 솔루션이 아닌 결과를 반환합니다 .
Nasenbaer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.