我首先要说的是,我非常介意使用接口,因此这可能是一个非常愚蠢的问题。如果我的标题不清楚,也要道歉-符合我的想法!我确实了解接口背后的原理,并且我想在这里使用它们既支持单元测试,又要通过DI框架以可怕的混乱和无法测试的旧代码进行解耦。我有一个名为IDatHandler的接口。它具有一个List 属性,称为Items。具体的实现应返回IDatContainer的具体类型。当然有一些方法,但我省略了public interface IDatHandler{ .... List<IDatContainer> Items { get; set; }}这是一个具体的实现:public class ADEColorHandler : IDatHandler { .... public List<ADEColor> Items { get; set; } }}ADEColor实现IDatContainer。除非我将ADEColor替换为IDatContainer,否则具体实现将失败。有没有一种方法可以让商品以ADEColor类型的列表形式返回,或者我只是违反了规则?我应该说这个应用程序当前正在使用NET 3.5========= >>>答案-谢谢Charleh!IDatHandler接口public interface IDatHandler<T> where T : IDatContainer{ .... List<IDatContainer> Items { get; set; }}具体的类:public class ADEColorHandler : IDatHandler<ADEColor> { .... public List<ADEColor> Items { get; set; } } }我的单元测试在ADEColorHandler上针对此列表进行声明并通过。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 您可以选择以下路线:public interface IDatHandler{ // Any common interface stuff}public interface IDatHandler<T> : IDatHandler where T : IDatContainer{ // Any generics List<T> Items;}public class ADEColorHandler : IDatHandler<ADEColor>{ .... public List<ADEColor> Items { get; set; }}这确实意味着您需要在另一端进行一些强制转换,因为如果仅传递IDatHandler实例,则需要先知道通用类型,然后才能查询Items您想达到什么目的?这可能有助于确定您可以使用的东西...或者,您可以在原始接口实现中使用IEnumerable-您是否需要在设计时知道集合的具体类型,还是可以摆脱转换?编辑:添加了上面的约束只是想弄清楚这是因为使用上述接口在某种程度上可以工作,但是我的假设是您想遍历这些接口来对其进行处理-我想知道这是否可行(需要检查)List<IDatHandler<IDatContainer>> someList = new List<IDatHandler<IDatContainer>>();someList.Add((IDatHandler<IDatContainer>)new ADEColorHandler());然后,您可以枚举列表...仅检查一下是否可行。编辑:不,因为通用类型实际上在运行时不同,所以不起作用。我会乱成一团-我喜欢尝试弄清楚泛型可以做什么和不能做什么!编辑:好的,所以最好的选择可能是: public interface IDatHandler<T> : IDatHandler where T : IDatContainer { List<T> Items { get; set; } } public class ADEColorHandler : IDatHandler<IDatContainer> { public List<IDatContainer> Items { get; set; } }这意味着您可以:var items = new List<IDatHandler<IDatContainer>>();items.Add(new ADEColorHandler());那么您可以从每个Items枚举并获取IDatHandler并查询每个IDatContainer。当然,您对具体类型不了解,但是我认为您在容器上有一个接口来尝试抽象那些实现细节。没关系关于c# - 我可以使用另一个接口(interface)实现将一个接口(interface)强制转换为具体类型吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13723437/ (adsbygoogle = window.adsbygoogle || []).push({});
10-10 03:08