如何指向通用抽象类?

skr*_*was 1 c# oop generics inheritance class

自从我上一次使用接口协方差问题以来,我没有遇到代码问题.今天我采用了另一种OLGAtherer架构的方法,我发现了巨大的(对我来说)障碍.我希望它只对我很大,我会在这里找到答案:)好的,请检查一下:

我有抽象的泛型类:

abstract class Repository<T> where T : Entity
Run Code Online (Sandbox Code Playgroud)

此类包含四个CRUD方法(添加,插入等)和两个受保护字段的签名.我将创建的任何存储库都必须从此超类继承.我有一些存储库,例如:

class BookRepository : Repository<Book>
Run Code Online (Sandbox Code Playgroud)

现在我有类DB负责DB文件的操作.而且有我的问题.看看放在DB类中的这个方法:

    void Add(List<Entity> enitites, Type entityType)
    {
       Repository<entityType> repo = EntitiesFactory(entityType);
       repo.Add(entities);
    }
Run Code Online (Sandbox Code Playgroud)

我知道上面的方法不起作用,但这可视化我的问题(希望) - 我想动态创建指定类型的存储库,但我不知道如何做到这一点.这一直是我的主要OOP问题 - 我可以编写继承(或接口的实现),但我不能使用这些继承的类.请向我澄清一下.先感谢您.

帕维尔


我使用了你提供的提示,这就是我现在所拥有的:

public void Add<T>(List<T> entities, string repoName) where T : Entity
{
   Repository<T> repo = RepoFactory<T>(repoName, typeof(T));
   repo.Add(entities);
}

private Repository<T> RepoFactory<T>(string repoName, Type t) where T : Entity
{
   if (t == typeof(Book))
   {
   Repository<T> repo = (Repository<T>)((object)(new BookRepository(this.ConnectionString, repoName)));
   }

   return null;
Run Code Online (Sandbox Code Playgroud)

}

RepoFactory现在在DB类中(顺便说一句,这里是某种类型的Bridge) - 它应该被移动到其他地方,但这不是一个主要问题.

首先,我不知道RepoFactory的身体是否以正确的方式实施 - 我猜不是.

第二 - 我假设我将从其他类调用DB方法(比方说 - WindowsForm,为简单起见).我将使用参数T调用Add,具体取决于用户的选择.这是我遇到问题并暂时修复它的情况,因为现在DB正常,但是如果我必须实现WindowsForm代码,我将再次遇到它(我想) - 将来我会试着找出答案同样的问题,但是在更高层次(上面的DB) - 我希望你理解我...我基本上是说,我不知道如何动态调用Add方法,因为T将依赖于用户的选择(OLGAtherer必须是Repository Manager,它将支持Books和其他类型的集合).如果用户尝试使用他的图书集,我将不得不调用Add()方法.如果使用Comics集合,则添加().我不喜欢

如果你理解我的意思,你真的很好:)我的英语很糟糕,但我正在努力.感谢您以前的回答,并提前感谢您的回答.帕维尔

Chr*_*ter 7

我不太清楚你想要什么.这会吗?

void Add<T>(List<T> entities) where T : Entity
{
   Repository<T> repo = EntitiesFactory(typeof(T));
   repo.Add(entities);
}
Run Code Online (Sandbox Code Playgroud)

此外,我建议您尽可能灵活地使用输入参数,例如使用IEnumerable<T>而不是使用List<T>此方法以及Repository<T>.Add()方法.您可能希望传入一个延迟评估的查询,或将多个LINQ方法链接在一起.