我在将通用类转换为它正在实现的接口时遇到了问题。
我的代码是这样的:
public interface IRepository<T> where T : EntityBase
{
T GetByID(Int32 Id);
Int32 Add(T entity);
void Update(T entity);
void Delete(Int32 Id);
DataTable GetAll();
}
public class Benificiares : BaseRepository, IRepository<Benificiare>
{
public int Add(Benificiare benificiare)
{
}
public DataTable GetAll()
{
}
public Benificiare GetByID(int Id)
{
}
public void Update(Benificiare benificiare)
{
}
public void Delete(Int32 Id)
{
}
}
这个类基本控制器,它使我的控制器具有通用功能,我想将它传递给任何存储库
public abstract class EntitiesController
{
public DataTable List_Items;
public OleDbDataAdapter _Da;
public DataSet _Ds;
public BindingSource _Bs;
public DataGridViewX Grid_Items;
public IRepository<EntityBase> _repository;
public BaseRepository base_repo;
public abstract void InitGridItems(DataGridViewX Grid_Items);
public EntitiesController(DataTable table, OleDbDataAdapter Da, DataSet Ds,BindingSource Bs,DataGridViewX Grid)
{
_Ds = Ds;
_Bs = Bs;
List_Items = table;
_Da = Da;
Grid_Items = Grid;
}
}
和最后一个
public class BenificiaresController : EntitiesController
{
private Benificiares repository = new Benificiares();
private Benificiare benificiare = new Benificiare();
public BenificiaresController(DataTable List_Benificiare,OleDbDataAdapter Da,DataSet Ds ,BindingSource Bs,DataGridViewX Grid)
:base(List_Benificiare,Da,Ds,Bs,Grid)
{
base._repository = (IRepository<EntityBase>)repository;
}
此行生成异常
base._repository = (IRepository<EntityBase>)repository;
无法将类型.......类Benificiares转换为接口IRepository
答案 0 :(得分:2)
您不能简单地将Foo<Derived>
分配给IFoo<Base>
,因为界面不是covariant/contravariant。但是,您也可以使基本控制器通用。例如:
public abstract class EntitiesController<TEntity> where TEntity : EntityBase
{
public IRepository<TEntity> _repository;
//snip
}
你的控制器将改为这样的东西,也不需要施放:
public class BenificiaresController : EntitiesController<Benificiare>
{
public BenificiaresController(.....) : base(....)
{
base._repository = repository;
}
}