我很震惊我没有在互联网上找到关于这个问题的任何内容,但可能我正在寻找错误的词语。这是我需要做的。
假设我有一个泛型类型:List<string>
的工作原理是为了简单起见。如何获取参数类型(在本例中为typeof(string)
)?
请记住,我需要在泛型类之外执行此操作(不在类方法中,这是我在其他SO问题中看到的)。底线是我有一个泛型类型的实例,我需要知道它的类型和它的参数类型(在上面的例子中,我想得到typeof(List)
和typeof(string)
,而不是像typeof(List<string>)
)之类的东西。当然,这必须在运行时完成。
感谢所有回复的人。
答案 0 :(得分:7)
听起来你正在寻找的是Type.GetGenericArguments()
。您可以在相关实例的Type
上调用它。它返回一个Type
(to 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.aspx和http://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);
其他选项是使用其他答案中描述的反射。