我想通过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/