C# 铸造类到接口

C# 铸造类到接口,c#,class,casting,polymorphism,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 Benificiare

我在将泛型类强制转换到它正在实现的接口时遇到问题

我的代码如下:

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)
    {
    }
}
公共接口IRepository,其中T:EntityBase
{
T GetByID(Int32 Id);
Int32 Add(T实体);
无效更新(T实体);
无效删除(Int32 Id);
数据表GetAll();
}
公共类好处:BaseRepository、IRepository
{
公共整数相加(Benificiare Benificiare)
{
}
公共数据表GetAll()
{
}
公共受益人GetByID(int Id)
{
}
公共作废更新(Benificiare Benificiare)
{
}
公共无效删除(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;
    }
}
公共抽象类EntitiesController
{
公共数据表列表项;
公共OLEDB数据适配器;
公共数据集;
公共绑定源;
公共DataGridViewX网格项;
公共电子存储库;
公共基础知识库基础知识库;
公共抽象void InitGridItems(DataGridViewX Grid_Items);
公共实体控制器(DataTable表、OleDbDataAdapter Da、数据集Ds、BindingSource Bs、DataGridViewX网格)
{
_Ds=Ds;
_Bs=Bs;
列表项目=表格;
_Da=Da;
网格项目=网格;
}
}
最后一个呢

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;
    }
public类BenificiaresController:EntitiesController
{
私有福利存储库=新福利();
私人福利=新福利();
公共BenificiaresController(DataTable List\u Benificiare、OLEDB数据适配器Da、数据集Ds、BindingSource Bs、DataGridViewX Grid)
:基本(列出受益方、Da、Ds、Bs、网格)
{
基本存储库=(IRepository)存储库;
}
此行生成异常

base._repository = (IRepository<EntityBase>)repository;
base.\u repository=(IRepository)存储库;
无法将…….类的类型转换为接口IRepository


您不能简单地将
Foo
分配给
IFoo
,因为接口不是通用的。但是,您也可以将基本控制器设置为通用的。例如:

public abstract class EntitiesController<TEntity> where TEntity : EntityBase
{
    public IRepository<TEntity> _repository;

    //snip
}
公共抽象类EntityController,其中tenty:EntityBase
{
公共电子存储库;
//剪断
}
您的控制器将更改为类似以下内容,同时也不再需要强制转换:

public class BenificiaresController : EntitiesController<Benificiare>
{
    public BenificiaresController(.....) : base(....)
    {
        base._repository = repository;
    }
}
public类BenificiaresController:EntitiesController
{
公共福利控制器(…):基础(…)
{
base._repository=存储库;
}
}

您不能简单地将
Foo
分配给
IFoo
,因为接口不是。但是,您也可以使基本控制器通用。例如:

public abstract class EntitiesController<TEntity> where TEntity : EntityBase
{
    public IRepository<TEntity> _repository;

    //snip
}
公共抽象类EntityController,其中tenty:EntityBase
{
公共电子存储库;
//剪断
}
您的控制器将更改为类似以下内容,同时也不再需要强制转换:

public class BenificiaresController : EntitiesController<Benificiare>
{
    public BenificiaresController(.....) : base(....)
    {
        base._repository = repository;
    }
}
public类BenificiaresController:EntitiesController
{
公共福利控制器(…):基础(…)
{
base._repository=存储库;
}
}