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

时间:2012-01-11 23:36:19

标签: c# generics reflection

我很震惊我没有在互联网上找到关于这个问题的任何内容,但可能我正在寻找错误的词语。这是我需要做的。

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

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

感谢所有回复的人。

4 个答案:

答案 0 :(得分:7)

听起来你正在寻找的是Type.GetGenericArguments()。您可以在相关实例的Type上调用它。它返回一个Typeto Eric Lippert's chagrin)数组。

答案 1 :(得分:4)

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

答案 2 :(得分:2)

var myList = new List<String>();
var shouldBeString = myList.GetType().GetGenericArguments().FirstOrNull();
var shouldBeGenericList = myList.GetType().GetGenericTypeDefinition();

分别见http://msdn.microsoft.com/en-us/library/system.type.getgenericarguments.aspxhttp://msdn.microsoft.com/en-us/library/system.type.getgenerictypedefinition.aspx

答案 3 :(得分: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);

其他选项是使用其他答案中描述的反射。