[C#] 제네릭 클래스 또는 메서드의 멤버에서 T 유형을 얻는 방법은 무엇입니까?

클래스 또는 메서드에 일반 멤버가 있다고 가정 해 보겠습니다.

public class Foo<T>
{
    public List<T> Bar { get; set; }

    public void Baz()
    {
        // get type of T
    }
}

나는 클래스를 인스턴스화 할 때이 T되고 MyTypeObject1, 그래서 클래스는 일반적인 목록 속성이 있습니다 List<MyTypeObject1>. 일반이 아닌 클래스의 일반 메소드에도 동일하게 적용됩니다.

public class Foo
{
    public void Bar<T>()
    {
        var baz = new List<T>();

        // get type of T
    }
}

클래스 목록에 어떤 유형의 객체가 포함되어 있는지 알고 싶습니다. 따라서 호출 된 목록 속성 Bar또는 로컬 변수 baz에는 어떤 유형의 T?

Bar[0].GetType()목록에 0 요소가 포함될 수 있기 때문에 할 수 없습니다 . 어떻게하니?



답변

올바르게 이해하면 목록에 컨테이너 클래스 자체와 동일한 유형 매개 변수가 있습니다. 이 경우에는 다음을 수행하십시오.

Type typeParameterType = typeof(T);

운 좋게도 objecttype 매개 변수로 사용하는 경우 Marc의 답변을 참조하십시오 .


답변

(참고 : 나는 당신이 아는 모든 것이 object또는IList 또는 유사한하고 목록이 실행시에 모든 유형이 될 수 있음)

당신이 그것을 알고 있다면 List<T>:

Type type = abc.GetType().GetGenericArguments()[0];

또 다른 옵션은 인덱서를 보는 것입니다.

Type type = abc.GetType().GetProperty("Item").PropertyType;

새로운 TypeInfo 사용하기 :

using System.Reflection;
// ...
var type = abc.GetType().GetTypeInfo().GenericTypeArguments[0];


답변

다음 확장 방법을 사용하면 리플렉션없이 벗어날 수 있습니다.

public static Type GetListType<T>(this List<T> _)
{
    return typeof(T);
}

또는 더 일반적인 :

public static Type GetEnumeratedType<T>(this IEnumerable<T> _)
{
    return typeof(T);
}

용법:

List<string>        list    = new List<string> { "a", "b", "c" };
IEnumerable<string> strings = list;
IEnumerable<object> objects = list;

Type listType    = list.GetListType();           // string
Type stringsType = strings.GetEnumeratedType();  // string
Type objectsType = objects.GetEnumeratedType();  // BEWARE: object


답변

시험

list.GetType().GetGenericArguments()


답변

그것은 나를 위해 일한 것입니다. 여기서 myList는 알 수없는 종류의 목록입니다.

IEnumerable myEnum = myList as IEnumerable;
Type entryType = myEnum.AsQueryable().ElementType;


답변

전체 Type 변수가 필요하지 않고 유형을 확인하려는 경우 임시 변수를 쉽게 만들 수 있으며 연산자는 연산자입니다.

T checkType = default(T);

if (checkType is MyClass)
{}


답변

이 유형을 일반 유형의 리턴 유형으로 사용할 수 있습니다.

public string ListType<T>(T value)
{
    var valueType = value.GetType().GenericTypeArguments[0].FullName;
    return valueType;
}