这是一个测试,在我看来,应该过去,但不是.
[TestMethod] public void can_get_open_generic_interface_off_of_implementor() { typeof(OpenGenericWithOpenService<>).GetInterfaces().First() .ShouldEqual(typeof(IGenericService<>)); } public interface IGenericService<T> { } public class OpenGenericWithOpenService<T> : IGenericService<T> { }
>为什么不通过?
>给定类型t = typeof(OpenGenericWithOpenService?)如何获取typeof(IGenericService?)?
我通常很好奇,但如果您想知道我在做什么,我正在编写一个Structuremap约定,将所有由类实现的接口转发到实现(作为单例).
解决方法
OpenGenericWithOpenService< T>不实现任意的IGenericService<> – 它实现IGenericService< T>与同级T一样.
public class OpenGenericWithOpenService<T1,T2> : IGenericService<T1> {}
现在重要的是,当您要求实现的接口时,您可以将其转换为IGenericService< T1>但是(不一致)不是IGenericService< T2>或任何其他实现.
换句话说,这不是完全开放的 – 它被固定在同一类型的参数上.
我从未对泛型术语非常好,但我希望你看到我的意思. IGenericService<>是一种等待给定类型参数的类型;在这种情况下,你有类型参数 – 它只是恰好是另一个类型参数!
这是一个通过测试:
[TestMethod] public void can_get_open_generic_interface_off_of_implementor() { Type[] typeParams = typeof(OpenGenericWithOpenService<>).GetGenericArguments(); Type constructed = typeof(IGenericService<>).MakeGenericType(typeParams); typeof(OpenGenericWithOpenService<>).GetInterfaces().First() .ShouldEqual(constructed); }
如果你改变类来实现(例如)IGenericService< int>相反,它会失败.