c# - 将抽象类的集合作为函数的参数传递

标签 c# .net

我想通过ICollection<AbstractClass>在函数中作为参数。但是当我用具体类型的集合调用它时,Visual Studio 显示错误

method has some invalid arguments

我的功能是:

    private void GenerateId(ICollection<BaseEntity> entities)
    {
        foreach (BaseEntity e in entities)
        {
           e.Id = _baseDao.GetNextId();
        }
    }

我的电话是:

GenerateId(entity.TitleAdmRegions);

AdmRegions 类型:

public virtual ICollection<TitleAdmRegion> TitleAdmRegions { get; set; }

AdmRegion 是:

public partial class TitleAdmRegion : BaseEntity
{
  //...
}

最佳答案

您必须进行显式转换 - 事实上,不能保证 T 的集合, 其中T继承自 U也是 U 的集合.当然,它很可能会,但是......

这种关系称为协变性——在通用“调用”中使用更具体的类型而不是其祖先的能力。 MSDN 有一篇关于 C# 主题的好文章 - http://msdn.microsoft.com/en-us/library/dd799517(v=vs.110).aspx

类型安全的方法实际上使用泛型非常简单:

private void GenerateId<T>(ICollection<T> entities)
  where T: BaseEntity
{
    foreach (var e in entities)
    {
       e.Id = _baseDao.GetNextId();
    }
}

同时,ICollection<T>不是协变的,IEnumerable<T>是。所以另一种简单的方法是使用 IEnumerable<BaseEntity>作为参数:

private void GenerateId<T>(IEnumerable<T> entities) { ... }

关于c# - 将抽象类的集合作为函数的参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23883112/

相关文章:

C#、WPF、MVVM 和 INotifyPropertyChanged

c# - 如何在 C# 上创建网络 map ?

c# - 反序列化 XML 时出现 FileNotFoundException

c# - BigInteger.ToString ("x") 没有正确打印负十六进制数

c# - 如何处理或检测 VB.NET 中的网络故障?

c# - .NET - neo4jclient - 从密码查询中检索结果

c# - 如何以编程方式将 "require a password on wakeup"上的值更改为 false?

c# - 打开每个 Window 窗体作为 MdiParent 的子窗体

c# - TFS Force 通过 SDK 以编程方式获取

c# - 使用 C# 从 DataTable 创建 HTML