(开放泛型类型)typeof泛型类型,未指定参数

时间:2012-11-01 17:14:11

标签: c# generics reflection

有人可以用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?它有什么实际用途?

2 个答案:

答案 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