【问题标题】:Is there a way to create a nested open generic type?有没有办法创建嵌套的开放泛型类型?
【发布时间】:2016-10-20 01:38:31
【问题描述】:

在 C# 中,很容易创建一个开放的泛型类型typeof(IEnumerable<>)。有没有办法创建一个包含开放泛型的类型?以下不起作用:typeof(IEnumerable<IFoo<>>)

【问题讨论】:

    标签: c# nested-generics open-generics


    【解决方案1】:

    获取所涉及的两个未绑定的泛型类型,然后使用一个作为参数从另一个创建泛型类型:

    typeof(IEnumerable<>).MakeGenericType(typeof(IFoo<>))
    

    【讨论】:

    • 这不会导致异常吗?根据 MSDN 文档,未绑定类型只能用于 typeof 句子,并且不允许将其与 MakeGenericType 一起使用...
    • @Gusman 也许您正在考虑的文档是指用于引用类型的 C# 语法,而不是 Type 对象本身? “typeof sentence”大概是指使用typeof 的C# 语法。此类表达式返回的对象仍然是Type 对象,并且首先具有此类语句的主要原因是然后生成相关的绑定类型。在这种情况下,我们有一个绑定到未绑定类型的绑定类型,但在 C# 中,我们仍然需要 typeof 为我们提供未绑定的绑定才能让我们走得那么远......
    • ... 对比一下,我们不能通过typeof 直接获取ref(包括out)类型,但可以通过typeof(int).MakeByRefType() 获取一个。
    • @Gusman 您是否在想 C# 规范中的哪个位置说“未绑定的泛型类型只能在 typeof-expression 中使用”?这确实正是我在这里所做的,但是从两个 typeof 表达式中获得了两个对象后,我使用了这些表达式的结果。
    【解决方案2】:

    没有办法。这些不是通用但未绑定的类型,这些是特殊类型,它们不能被实例化。未绑定的泛型类型只能在直接类型表达式中使用。

    当您使用 typeof(IEnumerable&lt;IFoo&lt;&gt;&gt;) 时,您不是在 typeof 表达式中使用未绑定类型,而是在 IEnumerable&lt;T&gt; 表达式中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      相关资源
      最近更新 更多