铸造classe接口

时间:2018-04-09 09:11:37

标签: c# class casting polymorphism

我在将通用类转换为它正在实现的接口时遇到了问题。

我的代码是这样的:

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

1 个答案:

答案 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;
    }
}