【问题标题】:(open generic type) typeof generic type with no parameters specified(开放泛型)typeof 泛型类型,没有指定参数
【发布时间】:2012-11-02 01:53:42
【问题描述】:

谁能解释我在 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&lt;&gt;)t2“更通用”,后者指定通用参数int,但b1 原来是false - 所以int? 的实例不是@ 的实例987654329@.

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

【问题讨论】:

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

标签: c# generics reflection


【解决方案1】:

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

不能。 (事实上​​,Nullable&lt;T&gt; 无论如何你都会遇到有趣的拳击问题,但我们开始了......)

在执行时,值始终是 close 类型的实例。 Nullable&lt;&gt;List&lt;&gt;open 泛型类型。在这种类型上调用 IsInstanceOfType 从来没有用处。但这并不意味着它没有用。

通常在反射中使用开放类型。例如:

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

可能有代码较高, 是通用的,但调用到较低级别时传入 Type 值,然后列表可以返回堆栈并被强制转换为 IEnumerable&lt;T&gt; T 的适当值。

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

您可以使用它来查明特定类型是否为 some 类型参数实现了通用接口 - 对于每个实现的接口,您可以查明它是否是通用的,获取泛型类型定义,看看它是否等于(比如说)IEnumerable&lt;&gt;

【讨论】:

    【解决方案2】:

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

    相反,您可以使用它来生成具体的(封闭)泛型类型,例如Nullable&lt;int&gt;

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

    【讨论】:

    • 能否提供open generic type的实际例子
    • @glaucus:一个具体的例子? typeof(List&lt;&gt;) 是开放泛型类型的示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 2020-11-15
    相关资源
    最近更新 更多