C# 泛型-将实例作为基类型传递

C# 泛型-将实例作为基类型传递,c#,templates,generics,C#,Templates,Generics,我目前正在为我们的新应用程序开发数据访问层,它不是一个大型应用程序,因此我决定使用Dao模式,在通过存储查询将每个模型项存储到数据库之前,将其转换为Dao项。 我尽可能多地使用通用接口和抽象类来消除重复操作,但现在遇到了一些障碍。 我们有一个Dao转换类的接口,如下所示: internal interface IDaoConverter<TModel, TDao> where TModel : ModelItem where TDao : DaoItem {

我目前正在为我们的新应用程序开发数据访问层,它不是一个大型应用程序,因此我决定使用Dao模式,在通过存储查询将每个模型项存储到数据库之前,将其转换为Dao项。

我尽可能多地使用通用接口和抽象类来消除重复操作,但现在遇到了一些障碍。

我们有一个Dao转换类的接口,如下所示:

internal interface IDaoConverter<TModel, TDao>
    where TModel : ModelItem
    where TDao : DaoItem
{
    ToDao(TModel inModel);
    inDao);
}
内部接口IDaoConverter
其中TModel:ModelItem
其中TDao:dao项目
{
ToDao(TModel inModel);
英道);
}
到目前为止,它工作得很好,并且适合它的函数。您可以在类定义中指定模型类型和它将转换为的Dao类型(1-1关系),并创建与这些类型匹配的函数。这些Dao转换器的实例存放在工厂中,以便于检索

下一步我要做的是创建数据访问类,这些类将使用它,我想用一种通用的方式来设计它

我想要的是一种方法,让Dao转换器工厂知道我想要一个可以处理特定类型的模型项的Dao转换器,但到目前为止,我找不到一种方法来指定它

public abstract class AbstractDataAccess<T> where T: ModelItem
{
    protected IDaoConverter<T,?> Converter;

    public void Init(IDaoConverter<T,?> inConverter)
    {
        Converter = inConverter;
    }
}
公共抽象类AbstractDataAccess,其中T:ModelItem
{
受保护的IDaoConverter转换器;
public void Init(IDaoConverter inConverter)
{
转换器=换流器;
}
}

我基本上希望能够在课堂上用我想要的任何类型来替换问号。由于这个原因,我目前不得不完全写出每个数据访问类。

如果在初始化时给出了转换器,那么可以将访问DaoConverter的方法抽象化,并派生一个(可能是抽象的)类,该类具有表示Dao类型的第二个类型参数

public abstract class AbstractDataAccess<T, TDao> : AbstractDataAccess<T> where ...
公共抽象类AbstractDataAccess:AbstractDataAccess,其中。。。

为什么不使用AutoMapper?您在界面上使用泛型,但是。。。如果您明确告诉
TDao
是一个
DaoItem
类,为什么不使用
DaoItem-ToDao(TModel-inModel)等方法将其声明为
内部接口IDaoConverter
?在这种情况下,AutoMapper是一个很好的选择,可以减少从模型转换到DAO或DAO的样板文件DTO@HuorSwords我的目标是坚持使用强类型参数,我只考虑将它们指定为DaoItem类型,但是采用DaoItem特定类型的数据库函数也需要丢失它们的强类型。@Peyman我们从未真正研究过AutoMapper,但我会尝试找时间。谢谢