在我看来,这是一个应该通过但没有通过的测试。[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> { }为什么不通过? 给定Type t = typeof(OpenGenericWithOpenService<>)我如何获得typeof(IGenericService )? 我通常很好奇,但是如果您想知道我在做什么,我正在写一个Structuremap约定,该约定将由类实现的所有接口(interface)转发给实现(作为单例)。 最佳答案 OpenGenericWithOpenService<T>不仅实现了任意的IGenericService<>,而且还实现了与该类相同的IGenericService<T>的T。证明这一点的最佳方法是稍微更改类:public class OpenGenericWithOpenService<T1, T2> : IGenericService<T1> {}现在很重要的一点是,当您要求它实现的接口(interface)时,您知道可以转换为IGenericService<T1>,但是(巧合的是)不能转换为IGenericService<T2>或任何其他实现。换句话说,它不是完全开放的,而是固定在类具有的相同类型参数上。我从来都不擅长使用泛型术语,但我希望您明白我的意思。 IGenericService<>是一种等待输入类型参数的类型;在这种情况下,您有type参数-它恰好是另一个type参数!这是将通过的测试:[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>,它将失败。关于c# - 开放实现的开放通用接口(interface)类型不等于接口(interface)类型吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2678336/
10-10 15:57