c#Generic无法将源类型转换为目标类型

时间:2013-12-10 12:49:01

标签: c# oop generics

我在项目中使用Repository模式。每个组件都有一个Bll类。

我想创建一个基本的bll类,子Bll类可以在没有相同的Repository Curd方法的情况下工作。

但似乎“无法将..DriverRepository转换为目标类型...存储库IEntity>”

语言:C#

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class , IEntity
{

    protected string ConnectionStringName;
    protected IDatabase Db;

    public Repository(string connStringName)
    {
        ConnectionStringName = connStringName;
        Db = new Database(ConnectionStringName);
    }
    public Repository()
    {
        ConnectionStringName = "DefaultConnection";
        Db = new Database(ConnectionStringName);
    }
}

public abstract class BaseBll
{
    protected Repository<IEntity> DefaultRepository;

    protected BaseBll(Repository<IEntity> repository)
    {
        _defaultRepository = repository;
    }    
    protected virtual List<IEntity> GetAll()
    {
        return DefaultRepository.GetAll();
    }
}

public class DriverRepository : Repository<Driver>
{
    public Driver GetDriverByLicenseNumber(string licenseNumber)
    {
        return Db.SingleOrDefault<Driver>("where LicenseNumber = @0", licenseNumber);
    }
}

public class DriverBll
{
    public DriverBll()
    {
        DefaultRepository = new DriverRepository();
        //***Throw the Cannot convert ... to ... Error. Why?****
    }
}

但是...

1 个答案:

答案 0 :(得分:1)

Repository中没有零参数构造函数,但DriverRepository继承了它。因为Repository中没有零参数构造函数,当DriverRepository尝试创建自身时,它没有可以在Repository上调用的构造函数。您需要从Repository(connectionString)的构造函数中调用DriverRepository构造函数。

public DriverRepository(string connectionString) : base(connectionString)
{
    ...
}

public DriverRepository() : base("YourConnectionString")
{
    ...
} 

编辑:澄清。 首先,在此代码示例中,DriverBll不会从BaseBll延伸,因此它不知道DefaultRepository属性。其次,Driver必须实施IEntity