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- 所以 instance ofint?不是 instance of Nullable<>

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

4

2 回答 2

4

那是一个开放的泛型类型
它不是一个实际的类型。不可能有这种类型的实例。

相反,您可以使用它来生成具体的(封闭的)泛型类型,例如Nullable<int>.

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

于 2012-11-01T17:15:56.780 回答
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.

同样,您可能希望创建一个带有反射的封闭类型来调用它的方法等。

您还可以使用它来确定特定类型是否为某个类型参数实现了泛型接口 - 对于每个实现的接口,您可以确定它是否是泛型的,获取泛型类型定义,并查看它是否等于 (say) IEnumerable<>

于 2012-11-01T17:17:49.837 回答