我有一类的定义如下;

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这是两种完全不同的类型。

  • 如果你想要保存一个通用的成员内部的一类,那么类型的参数必须要具体类型,或者它们必须被宣布为类型参数的家长级宣言》(使 通用).

选项:

  • 使用一般类型的论点你父类。
  • 删除新的()约束自己的类声明。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top