C# 关于带有集合的返回类型的问题

C# 关于带有集合的返回类型的问题,c#,collections,C#,Collections,在我的BL(将是一个公共API)中,我使用ICollection作为Find方法中的返回类型,如: public static ICollection<Customer> FindCustomers() { Collection<Customer> customers = DAL.GetCustomers(); return customers; } publicstaticicollection FindCustomers() { Collection

在我的BL(将是一个公共API)中,我使用ICollection作为Find方法中的返回类型,如:

public static ICollection<Customer> FindCustomers()
{
   Collection<Customer> customers = DAL.GetCustomers();

   return customers;
}
publicstaticicollection FindCustomers()
{
Collection customers=DAL.GetCustomers();
返回客户;
}
请注意使用ICollection而不是Collection

现在在我的GUI中,我需要将结果转换回集合,如:

Collection<Customer> customers = (Collection<Customer>)BL.FindCustomers();
Collection customers=(Collection)BL.FindCustomers();
这是因为我需要在返回的列表上使用一些特定于集合的方法,而我不能使用ICollection

这是正确的用法吗?或者我应该简单地将返回类型从Collection改为ICollection以避免这种强制转换吗


其次,我没有使用IEnumerable,因为它比ICollection更通用,甚至没有像Count这样的简单属性。我真的不认为在这里推广回报类型有什么意义。我遗漏了什么重要的东西吗?

返回ICollection的想法是为了减少方法上的耦合。如果您以后想构建一个列表,而不是一个集合,那么您将能够在不破坏客户机代码的情况下完成这项工作

如果您只是为了获得一个集合(而不是一个ICollection),那么您可以更改为Collection,因为您知道您将有一个不太灵活的方法。但无论如何


此外,如果您担心设计问题,我建议不要将此设置为静态,以减少代码的复杂性。

这可能是因为集合实现了IList,它有一些ICollection没有的额外方法,IList对您来说就足够了。
您缺少哪些方法?

使用ICollection的全部目的是更通用,隐藏更多信息,这是一件好事


但是如果您需要将其转换回,它就变得毫无意义,您还不如返回功能更强大的集合

如果要要求用户使用收集方法,可能应该返回Collection而不是ICollection

或者可以使用单独的函数,该函数位于程序集内部,用于返回GUI所需的类型:

internal static ICollection<Customer> FindCustomers()
{
    Collection<Customer> customers = DAL.GetCustomers();

    return customers;
}
内部静态ICollection FindCustomers()
{
Collection customers=DAL.GetCustomers();
返回客户;
}

返回ICollection的唯一原因是为了松耦合和继承。如果您的方法只有一个版本(这是因为它是静态的),那么您将始终知道返回类型(集合),并且无需将其设置为ICollection。但是,如果您在一系列类中使用,可能会有一个返回和ICollection的虚拟或抽象方法,然后在子类实现中,可以返回集合或FunkyCollection或实现接口的任何对象,因此这使您比只返回集合更加灵活。但是出于您的目的,您应该只创建返回类型集合,而不是ICollection,因为它是一个不会被重写的静态方法。另外,这也减少了用户的困惑,因为他们不需要施压。

其他人已经给出了这么好的答案,但我只是想澄清,不,我不相信你所做的是理想的。这样做的原因是,如果有人稍后出现并修改/重构/重新实现BL,以返回其他类型的
ICollection
(根据API),而这些类型的ICollection实际上不是
集合
,则GUI中会出现运行时错误

但是,您仍然可以选择从BL返回一个
I集合
:然后,如果您真的想要一个
集合
(我猜可能是为了它的一个或多个方便的扩展方法),那么您可以创建一个新集合,并将内容从一个集合复制到另一个集合。这样,您就不会冒运行时错误的风险。尽管如此,它最终取决于(正如其他人所问的)您在
集合中寻找的方法。。。也许有更好的方法来做你想做的事

祝你好运
-f