C# 将集合作为接口(interface)集合传递

标签 c# collections interface decoupling

我在下面的代码中简化并重现了我的问题。我收到的错误是:参数 1:无法从“System.Collections.ObjectModel.Collection”转换为“System.Collections.ObjectModel.Collection”

导致此问题的设计决策的一些背景:我创建了一个用于处理“IFruit”的 Web 服务,但由于 SOAP 的性质和我理解的端点绑定(bind),我创建了具有显式实现的方法水果。在业务层,为水果的每个具体实现创建一个单独的方法,首先会导致大量重复代码,其次业务层和服务层耦合得足够紧密,以至于以后在 web 服务中接受新的 IFruit 类型也需要更改我的代码在业务层(添加另一份冗余代码)。这种设计是我过去使用 Java 成功实现的设计,但 C# 接口(interface)似乎完全不同,足以让我失望。请指教。

public interface IFruit{
    public string TakeBite();
}

public Apple : IFruit{
    public string TakeBite(){
        return "tasty bite of apple";
    }
}

public void EatFruit(Collection<IFruit> fruits){
    foreach(var fruit in fruits){
        Console.WriteLine(fruit.TakeBite());
    }
}

public void EatApples(Collection<Apple> apples){
    this.EatFruit(apples);
}

最佳答案

尝试更改您的 EatFruit接受方法IEnumerable<IFruit>

public void EatFruit(IEnumerable<IFruit> fruits)
{
    foreach (var fruit in fruits)
    {
        Console.WriteLine(fruit.TakeBite());
    }
}

界面IEnumerable<out T>支持协方差,因为它标有 out修饰符。 Collection<T>没有标有这样的修饰符。

关于C# 将集合作为接口(interface)集合传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11367341/

相关文章:

mongodb - 将 mgo 与转换为 map[string]interface{} 的嵌套文档一起使用。如何遍历 map ?

c# - 更改 Xamarin.Forms.Maps 中缩放按钮 (+-) 的位置

c# - 如何从软件中捕获准确的 USB-HID 设备交互并在我自己的代码中重新实现它

c# - .NET 服务 OData 从 LINQ 查询返回匿名类型

java - 如何检查两个集合是否相等,忽略大小写?

scala - 在 Scala 中拆分出 3 个或更多数组

java - 查看fxml里面的逻辑(特别是迭代)

kotlin - 限制 Kotlin 中伴随对象的类型

c++ - c++-通过抽象模板基类接口(interface)指针访问派生类方法,而接口(interface)中没有显式类型

c# - 将值从struct分配给变量失败