我该如何获取实例化泛型的参数类型?

3

我很惊讶在互联网上没有找到关于这个问题的任何内容,但可能我用的关键词不对。我的需求是:

假设我有一个泛型类型:List<string>(为了简单起见)。我如何获取参数类型(在本例中为typeof(string))?

请注意,我需要从泛型类外部执行此操作(而不是在类方法内部,这是我在其他SO问题中看到的)。底线是,我有一个泛型类型的实例,我需要知道它的类型和参数类型(在上面的示例中,我想同时得到typeof(List)typeof(string),而不是typeof(List<string>)之类的任何东西)。当然,这必须在运行时完成。

感谢每一个回复的人。


1
可能是重复的问题:如何获取泛型类型的类型参数? - Igby Largeman
实际上,Igby。抱歉出现了重复,老实说我找不到它。我查看了表单提供的类似问题,但没有找到合适的答案。感谢任何人的回答! - Simone
4个回答

7

4
typeof(List<string>).GetGenericArguments()[0]

2

我只是因为它的完整性才批准这个答案,但Harpo和Osman的答案同样正确。谢谢! - Simone

1

为什么不把你的函数写成通用的呢?这样编译器会帮你解决问题的。

void your_func<T>(List<T> lst)
{
    Type list_type = typeof(List<T>);
    Type generic_list_type = typeof(List<>);
    Type generic_argument_type = typeof(T);
    // do what you need     
}

你可以像平常一样调用它:

var lst = new List<string>(); 
// ...
obj.your_func(lst);

另一个选择是使用反射,如其他答案所述。


Krizz,我不知道通用类型将是一个List。实际上,我需要处理任何类型,没有任何先验知识,无论它是通用类型以及它有多少个通用参数。这就是为什么我不能使用这种方法的原因。 - Simone
好的,我没有从问题中清楚地理解。那么你肯定需要按照其他答案中所述使用反射。 - Krizz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接