2012-11-01 66 views
2

有人可以用C#语言解释需要typeof(SomeGenericType<>),没有指定具体参数。(开放泛型类型)泛型类型,没有指定参数

我总结了以下例子:

 var t1 = typeof(Nullable<>); 
     var t2 = typeof(Nullable<int>); 
     var q = 1 as int?; 

     var b1 = t1.IsInstanceOfType(q); //false 
     var b2 = t2.IsInstanceOfType(q); //true 

我首先想到typeof(Nullable<>)t2,指定泛型参数int“更通用的”,但b1原来是false - 这样的int?实例不是Nullable<>的实例。

那么应该如何为b1定义一个变量为true?它有什么实际用途?

+1

“X比Y更通用”与“Y是X的实例”不同义。 –

回答

4

那么应该如何为b1定义一个变量为真?

它不能。 (实际上,用Nullable<T>反正你会碰到有趣的拳击问题,但是我们可以去...)

在执行时,值总是关闭类型的实例。 Nullable<>,List<>开放通用类型。在这种类型上拨打IsInstanceOfType无关紧要。这并不意味着它是无用的。

典型的开放类型用于反射。例如:

public IList CreateList(Type elementType) 
{ 
    Type closedType = typeof(List<>).MakeGenericType(elementType); 
    return (IList) Activator.CreateInstance(closedType); 
} 

可以有代码高达其通用的,但调用到较低水平Type值传递,而不是 - 列表,然后可以回去堆栈和强制转换为IEnumerable<T>为适当的值为T

同样,你可以在特定类型是否实现了一些一个通用的接口,要创建一个封闭式用反射来调用它的方法,等等。

可以用它来找出类型参数 - 对于实现的每个接口,您可以找出它是否是泛型的,获取泛型类型定义,并查看它是否等于(比如说)IEnumerable<>

4

这是一个开放式通用类型
这不是一个实际的类型;不可能拥有该类型的实例。

取而代之,您可以使用它来生成一个具体的(关闭的)泛型类型,如Nullable<int>

您还可以通过检查其GetGenericTypeDefinition()方法来检查封闭泛型类型是否是特定开放泛型类型的实例。

+0

你能否提供一个'开放泛型类型' –

+0

@glaucus的实际例子:一个实际的例子是什么? 'typeof(List <>)'是一个开放泛型类型的例子。 – SLaks