通用容器内部的类型

时间:2014-10-17 14:11:13

标签: c# generics covariance

public T getValueByName<T>(String name)
{
    if( T is List )
        Object containedType = T.WhatGoesHere()?
...

在上面的代码中,我需要知道是否可以将List转换为传入的任何类型的列表,例如List<Control>

有没有办法询问包含类型的泛型?我可以List<Control>List<String>List<Form>等等。

我可以将API拆分为在传递包含类型的单独方法中返回列表,因此要求调用者对列表使用一种方法,对简单类型使用一种方法。无论哪种方式,他们都必须知道什么会回来,但如果有一种顺利的方式来做我想问的事情,我宁愿保持API的简单。

注意:这是缺乏协方差的解决方案,因为即使在包含的类型上定义了隐式转换运算符,List to T的转换也会失败。因此,为了遵循解决方案listOfB.Cast<A>(); from here,我需要知道要投射什么(什么是A)。

谢谢!

1 个答案:

答案 0 :(得分:4)

您可以从typeof(T)开始,以获取代表System.Type的{​​{1}}实例。 完成后,您可以检查T以查看它是否真的是通用的,然后调用Type.IsGenericType以查看使用了哪些泛型参数。

例如,如果Type.GetGenericArguments()T List<int>IsGenericTypetrue将返回包含一个元素的数组:GetGenericArguments() < / p>

例如,下面是我编写的一段代码,用于查看给定类型(变量System.Int32)是否为某些实现,如果type其中IEnumerable<T>未知。首先要看看它是否是通用的,然后确定它是否只有一个参数,确定所述参数并查看它是否实现了接口,给定该参数:​​

T

供参考,见: