제네릭 형식 인수의 형식 이름을 어떻게 얻습니까?


99

다음과 같은 메서드 서명이있는 경우

public string myMethod<T>( ... )

메소드 내에서 유형 인수로 제공된 유형의 이름을 어떻게 얻을 수 있습니까? 와 비슷한 작업을 typeof(T).FullName하고 싶지만 실제로 작동합니다 ...


10
typeof(T).FullName 작동 해야 합니다. 대신 무슨 일이 일어나고 있습니까?
Nathan Taylor

나는 그 진술에서 컴파일러 오류를 얻었습니다-그러나 분명히 다른 것 때문에 발생했습니다. 감사!
Tomas Aschan 2010

답변:


156

코드가 작동합니다. typeof(T).FullName완벽하게 유효합니다. 이것은 완전히 컴파일되고 작동하는 프로그램입니다.

using System;

class Program 
{
    public static string MyMethod<T>()
    {
        return typeof(T).FullName;
    }

    static void Main(string[] args)
    {
        Console.WriteLine(MyMethod<int>());

        Console.ReadKey();
    }

}

위의 인쇄 실행 (예상대로) :

System.Int32

MyMethod <int >> ()로 테스트하고 결과를 확인하십시오. 해당 시나리오에서 기본 형식을 관리하는 경우 nullable 형식을 고려해야합니다.
GR7

1
" <int?>"을 의미합니다. 그렇다면 작동하지만 System.Nullable<int>(전체 이름 구문으로) 얻을 수 있습니다. 예상했던 것입니다 ...
Reed Copsey

내가 이미 해결책을 가지고 있었음에도 불구하고 (어떤 이유로 든 작동하지 않았지만 ...), 지금까지 가장 좋은 답변을 작성하기위한 담당자 포인트를 줄 것입니다 =)
Tomas Aschan 2010-04-05

1
나는 가정 때문에 그냥 날 도움 nameof(T)typeof(T).Name같은 일을 할 것입니다. 알고 보니 nameof(T)그냥 돌아갑니다 T.
dahvyd

5

typeof(T).Name그리고 typeof(T).FullName나를 위해 노력하고 있습니다. 인수로 전달 된 유형을 얻습니다.


1
아. 전달한 유형이 Nullable 인 경우 기본 유형을 가져 오려면 typeof (T) .GetGenericArguments () [0]
GR7

유형이 nullable인지 확인하려면 typeof (T) .IsGenericType을 사용하고, 그렇다면 다음을 사용하여 Name 또는 FUllName ((Type) typeof (T) .GetGenericArguments () [0 ]). 이름
GR7

1

사용 가능한 T의 인스턴스가 있다고 가정하면 다른 유형과 다르지 않습니다.

var t = new T();

var name = t.GetType().FullName;

2
T의 인스턴스도 필요하지 않습니다 .... typeof (T)는 인스턴스없이 잘 작동합니다. 하위 클래스가 메서드에 인수로 전달되면 다른 동작을 제공합니다 ..
Reed Copsey

1
이 코드의 문제점은 T에 매개 변수없는 생성자가 없으면 작동하지 않는다는 것입니다.
Nathan Taylor

@Nathan-T의 인스턴스를 얻는 것을 보여주는 예제 일뿐입니다. 아마도 일반적인 메서드에서 T 유형을 사용할 수있을 것입니다. @Reed-당신은 물론 맞습니다, 나는 그것이 그가 추구 한 것이라고 생각했습니다.
womp

또 다른 문제는 T가 추상 클래스 또는 인터페이스 인 경우입니다. 위 코드는 작동하지 않습니다. 제네릭 유형 제약 ( "where")이있는 경우 생성자를 알고 실제로 유형을 인스턴스화 할 이유가있을 수 있으므로이 유형의 코드는 안전 할 수 있습니다. 그 인스턴스화 외에는 낭비입니다.
Andrew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.