我有这个模型类:
public class FunctieModel: ObservableObject
{ ... }
存储库的基本接口:
public interface IBaseRepo<T> where T : ObservableObject
{
void Delete(int id);
T GetItem(int id);
IEnumerable<T> GetList();
bool Update(T model);
bool Insert(T model);
}
FunctieModel 类型存储库的特定接口
public interface IFunctieRepo : IBaseRepo<FunctieModel>
{}
我的FunctieModels:存储库的实现
public class FunctieRepoSql : IFunctieRepo
{...}
我的测试程序类必须能够与必须注入的存储库一起工作:
public class Tester
{
IBaseRepo<ObservableObject> repo;
public Tester(IBaseRepo<ObservableObject> repo)
{
this.repo = repo;
}
}
这一切都很好。现在我需要用不同的存储库实例化测试程序类。
new Tester(new FunctieRepoSql())
这就是我的问题所在。错误为
无法从FunctieRepoSql
转换为IBaseRepo<ObservableObject>
我显然错过了什么。有人知道我该怎么做吗?
无法将IBaseRepo<FunctieModel>
转换为IBaseRepo<ObservableObject>
。例如,想象一个普通的集合,比如猫,如果你把它转换成一个动物集合,你就可以在其中添加一只狗,这是不可取的。但是,您可以在此处使用out
关键字:
public interface IBaseRepo<out T> where T : ObservableObject
但是,您将无法接受ObservableObjects作为输入(msdnabout-out)。
您需要考虑两个关键选项。最简单的方法是简单地使Tester
通用,并使用一个可以传递给IBaseRepo<T>
的类型参数。
public class Tester<T> where T : ObservableObject
{
IBaseRepo<T> repo;
public Tester(IBaseRepo<T> repo)
{
this.repo = repo;
}
}
然后您可以将您的呼叫代码更改为:
new Tester<FunctieModel>(new FunctieRepoSql())
如果由于任何原因无法使用此技术,则可以创建另一个非通用接口IBaseRepo
,IBaseRepo<T>
对此接口进行扩展。它应该将等效方法表示为IBaseRepo<T>
(对于那些使用T
的方法),但在不使用该类型参数的情况下声明它们。这类似于IEnumerable
和IEnumerable<T>
。完成此操作后,可以使Tester
在其构造函数中接受IBaseRepo
,而不是通用版本。