C#GetType():如何在没有实际元素的List <t>中获取T的类型?</t>

时间:2010-10-28 02:07:09

标签: c# reflection

如果我这样做:

var a = new List<something>();
var b = new something();
a.Add(b);
var c = a[0].GetType();

C拥有我想要的类型(这是“某事”)。如何在不创建列表的情况下获得“某事”的类型?

3 个答案:

答案 0 :(得分:7)

在这种情况下,你可以说var c = typeof(something);,但在一般情况下你可以使用它:

Type c = a.GetType().GetGenericArguments()[0];

更具体地说,可能有4种不同的情况:

void func1(List<something> arg)
{
    Type t = typeof(something);
}

void func2<T>(List<T> arg)
{
    Type t = typeof(T);
}

void func3(object arg)
{
    // assuming arg is a List<T>
    Type t = arg.GetType().GetGenericArguments()[0];
}

void func4(object arg)
{
    // assuming arg is an IList<T>
    Type t;

    // this assumes that arg implements exactly 1 IList<> interface;
    // if not it throws an exception indicating that IList<> is ambiguous
    t = arg.GetType().GetInterface(typeof(IList<>).Name).GetGenericArguments()[0];

    // if you expect multiple instances of IList<>, it gets more complicated;
    // we'll take just the first one we find
    t = arg.GetType().GetInterfaces().Where(
        i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IList<>))
        .First().GetGenericArguments()[0];
}

如果您在T中寻找IList<T>,那么它会变得复杂,因为您实际上可以拥有一个声明为class FooBar: IList<Foo>, IList<Bar>的类型。这就是为什么最后一个函数提供了几种不同的可能性。如果你想在模棱两可的情况下抛出异常,请选择第一种可能性。如果您只想选择任意一个,请选择第二个。如果你关心你得到哪一个,你将不得不做更多的编码,以某种方式选择哪一个最符合你的需求。

答案 1 :(得分:2)

尝试:

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

答案 2 :(得分:1)

使用typeof运算符,例如typeof(T)typeof(something)