传递抽象类的集合作为函数中的参数

Yur*_*rov 1 .net c#

我想传递ICollection<AbstractClass>函数作为参数.但是当我用具体类型的集合调用它时,Visual Studio向我显示错误

方法有一些无效的参数

我的功能是:

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

我的电话是:

GenerateId(entity.TitleAdmRegions);
Run Code Online (Sandbox Code Playgroud)

AdmRegions类型:

public virtual ICollection<TitleAdmRegion> TitleAdmRegions { get; set; }
Run Code Online (Sandbox Code Playgroud)

AdmRegion是:

public partial class TitleAdmRegion : BaseEntity
{
  //...
}
Run Code Online (Sandbox Code Playgroud)

Lua*_*aan 6

你必须做一个显式的演员 - 实际上,不能保证一个集合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();
    }
}
Run Code Online (Sandbox Code Playgroud)

而且,虽然ICollection<T>不是协变,但是IEnumerable<T>.所以另一种简单的方法是IEnumerable<BaseEntity>用作参数:

private void GenerateId<T>(IEnumerable<T> entities) { ... }
Run Code Online (Sandbox Code Playgroud)