有人可以用typeof(SomeGenericType<>
的C#语言解释我的需要,没有指定具体的参数。
我把以下例子放在一起:
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
?它有什么实际用途?
答案 0 :(得分:4)
这是开放式通用类型 这不是一个真实的类型;不可能有这种类型的实例。
相反,您可以使用它来生成具体(已关闭)泛型类型,例如Nullable<int>
。
您还可以通过检查其GetGenericTypeDefinition()
方法来检查封闭泛型类型是否是特定开放泛型类型的实例。
答案 1 :(得分:4)
那么应该如何为b1定义一个变量为真呢?
它不能。 (事实上,对于Nullable<T>
,无论如何你都会遇到有趣的拳击问题,但我们会去......)
在执行时,值始终是已关闭类型的实例。 Nullable<>
,List<>
是开放泛型类型。在这种类型上调用IsInstanceOfType
永远不会有用。但这并不意味着它没用。
通常在反射中使用开放类型。例如:
public IList CreateList(Type elementType)
{
Type closedType = typeof(List<>).MakeGenericType(elementType);
return (IList) Activator.CreateInstance(closedType);
}
可能存在 泛型的高代码,但调用较低级别传递Type
值 - 然后该列表可以返回堆栈并转换为{{ 1}}适用于IEnumerable<T>
的值。
同样,你可能想要创建一个带反射的封闭类型来调用它上面的方法等等。
您也可以 使用它来查明特定类型是否为某些类型参数实现通用接口 - 对于每个实现的接口,您可以查看它是否是通用的,获取泛型类型定义,并查看它是否等于(比如)T
。