假设我有一个接口:IFoo<T1,T2>
和一个类Moo<T1> : IFoo<List<T1>, Stack<T1>>
.
在运行时我可以调用:typeof(Moo<>).GetInterfaces()
它给了我一个包含一种类型的数组,所以我想在某种意义上typeof(IFoo<List<>, Stack<>>)
可以在运行时创建类型.但是,该语法不起作用.
在运行时定义该类型的正确语法是什么?
我想在某种意义上,
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>
,其中T1
是T1
的Moo<T1>
,而不是T1
的IFoo<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>>
.
我很好奇为什么你想要首先构建这样一个奇怪的类型.你的申请是什么?
归档时间: |
|
查看次数: |
451 次 |
最近记录: |