定义嵌套的无界泛型类型

bri*_*ler 1 c# generics

假设我有一个接口:IFoo<T1,T2>和一个类Moo<T1> : IFoo<List<T1>, Stack<T1>>.

在运行时我可以调用:typeof(Moo<>).GetInterfaces()它给了我一个包含一种类型的数组,所以我想在某种意义上typeof(IFoo<List<>, Stack<>>)可以在运行时创建类型.但是,该语法不起作用.

在运行时定义该类型的正确语法是什么?

Eri*_*ert 7

我想在某种意义上,typeof(IFoo<List<>, Stack<>>)可以在运行时创建类型.

虽然这种说法是正确的,但你的逻辑并不合理,因为真正的结论并不符合你所说的前提.返回的类型

typeof(Moo<>).GetInterfaces()[0]
Run Code Online (Sandbox Code Playgroud)

不是和最初IFoo<T1, T2>建造的. List<>Stack<>

相反,它被IFoo<T1, T2>构造成具有List<T1>Stack<T1>,其中T1T1Moo<T1>,而不是T1IFoo<T1, T2>.在制作示例代码以讨论类型构造时,我强烈建议您不要生成逻辑上不同但名称相同的类型参数.这非常令人困惑.

如果不清楚,让我们退后一步.每个泛型类型都有一个称为其实例类型的关联类型,它是使用自己的类型参数构造的泛型类型.也就是说,当你说:

class C<T>
{
    Type type1 = typeof(C<T>);
    Type type2 = typeof(C<>);
}
Run Code Online (Sandbox Code Playgroud)

编译器的角度来看,类型 C<>类型C<T>是相同的.但是,这些将是不同的类型在运行时的对象自然是因为在运行时,绝不会有的一个实例C<T>而已,C<int>或者C<string>还是别的什么东西.第一种typeof语法为您提供在运行时构造的类型.第二个从编译器的角度为您提供实例类型.

因此,让我们更详细地考虑您的情况.假设你有:

interface I<T, U> {}
class C<V> {}
class D<W> {}
class E<X> : I<C<X>, D<X>> {}
Run Code Online (Sandbox Code Playgroud)

然后typeof(E<>).GetInterfaces()[0]编译器已知的类型,即I<C<X>, D<X>>.但是I<C<>, D<>>是完全不同的类型; I<C<V>, D<W>>从编译器的角度来看,它不是完全相同的类型.

在运行时定义该类型的正确语法是什么?

空无一人.

没有C#typeof语法产生类型"使用类型参数构造的泛型类型,它是其他泛型类型的实例类型".那将是:

typeof(I<,>).MakeGenericType(typeof(C<>), typeof(D<>)) 
Run Code Online (Sandbox Code Playgroud)

给你I<C<V>, D<W>>.

也没有typeof"使用不同泛型类型的类型参数构造的泛型类型" 的语法.kvb的答案给出了构建所需的Reflection代码I<C<X>, D<X>>.

我很好奇为什么你想要首先构建这样一个奇怪的类型.你的申请是什么?