C#法为宣布一个可变的一个抽象的一般类型
-
03-07-2019 - |
题
我有一类的定义如下;
public abstract class Repository<TEntity, TDataContext> : DisposableBaseClass
where TEntity : class
where TDataContext : DataContext, new()
{...contains Linq to SQL related functionality
在具体的分类定义的类型;
public class ConcreteRepo : Repository<LSTableClass, LSDataContext>
在下一层,我们的业务对象,其中持有的储存库的目作为一个私人可变的。
这是罚款;
private ConcreteRepo _repository;
但是,我随后进行了重构,这成为一个父类为所有的业务对象-这个父类拥有的储存库/实现处置模式,以处理存储库等。
我的问题是,我只是不能得到法的权利宣言的变量。
最近我来;
protected Repository<Object, DataContext> _repository;
但是这个给编译错误:
"1错误'系统。数据。皇宫.属性'必须是非抽象的类型有一个公共的无参构造,以便利用它作为参数'TDataContext'在一般类型或方法'。...库'..."
我已经试过各种其他的事情但是命中的其他问题。
在业务层对象的继承这个抽象的类我是创造和使用_repository变量投;
(Repository<LSTableClass, LSDataContext>)_repository = new ConcreteRepo();
- 我认为这会好起来的,假设我可以得到这个宣言权在父母。
如果我不能得到这工作我必须声明的_repository在每个业务对象,与全/具体类型细节,并实施的处置模式中的每一个清晰起来。不端的世界,但我想没有。
解决方案
如果我理解你的问题是否正确,你需要添加的第三个通用的参数,储存库的类型,它被限制为一个的后裔 Repository
用适当的参数类型。
概述它一些更多的:
public abstract class Repository<TEntity,TDataContext>
where TEntity : class
where TDataContext : DataContext, new() {}
public abstract class BusinessObject<TEntity,TDataContext,TRepository>
where TEntity : class
where TDataContext : DataContext, new()
where TRepository : Repository<TEntity,TDataContext>
{
TRepository _repository;
}
public class ConcreteObject : BusinessObject<LSTableClass,LSDataContext,ConcreteRepo>
{ // ...
我知道这可能不是作为紧凑的,你会喜欢的,但需要什么来减少这下有效地仍然保留强大的打字、高了通用类型(所谓的种类型的类别):一方式的指示,这类参数本身就是通用的,并可以采取类参数。
其他提示
你的宣言
protected Repository<Object, DataContext> _repository;
没有工作,因为在约束你放在:
...
where TDataContext : DataContext, new()
具体地说的 new()
部分。
我猜你想'注入'一个目满足你的泛的界面。
两件事情:
你不能之间的转换
Repository<Object, DataContext>
和Repository<LSTableClass, LSDataContext>
.不C#3.这就是所谓逆/协和不可直到C#4.C#3这是两种完全不同的类型。如果你想要保存一个通用的成员内部的一类,那么类型的参数必须要具体类型,或者它们必须被宣布为类型参数的家长级宣言》(使 那 通用).
选项:
- 使用一般类型的论点你父类。
- 删除新的()约束自己的类声明。