C# 泛型的分层使用

C# 泛型的分层使用,c#,generics,hierarchical,C#,Generics,Hierarchical,我在尝试将泛型类型“传播”到多个子类层时遇到了一些问题。 我有三层课程: genericsresponsedtomapper是一个抽象类,T是一个genericsearchrresponsedto 我有两个子类扩展了GenericResponseDtoMapper:SimpleResponseDtoMapper和GroupedResponseDtoMapper。 在这两个子类中,我被迫指定泛型类型;为了保持距离,我必须写: SimpleResponseDtoMapper:GenericRespo

我在尝试将泛型类型“传播”到多个子类层时遇到了一些问题。 我有三层课程:
genericsresponsedtomapper
是一个抽象类,
T
是一个
genericsearchrresponsedto

我有两个子类扩展了
GenericResponseDtoMapper
SimpleResponseDtoMapper
GroupedResponseDtoMapper
。 在这两个子类中,我被迫指定泛型类型;为了保持距离,我必须写:

SimpleResponseDtoMapper:GenericResponseDtoMapper

最后,我有一些类扩展了
SimpleResponseDtoMapper
,还有一些类扩展了
GroupedResponseDtoMapper
。 我的问题是无法在此级别指定
GenericSearchResponseDto
的子类型

那么,我如何管理泛型类型,以便将泛型类型留给第一层和第二层类,让较低级别的类使用泛型类型的指定类型呢

代码如下:

public abstract class GenericResponseDtoMapper<T> : IResponseDtoMapperDecorator where T : GenericSearchResponseDto
{
    protected List<T> items;

    public GenericResponseDtoMapper()
    {
        items = new List<T>();
    }

    public abstract IList<T> GetItems(IList<Entity.FullText_xml.DreDoc> documents);
}
公共抽象类GenericResponseDtoMapper:IResponseDtoMapperDecorator,其中T:GenericSearchResponseDto
{
受保护的清单项目;
公共GenericResponseDtoMapper()
{
项目=新列表();
}
公共摘要IList GetItems(IList文档);
}
类SimpleResponseDtoBuilder:

public abstract class SimpleResponseDtoBuilder : GenericResponseDtoMapper<GenericSearchResponseDto>
{
    public SimpleResponseDtoBuilder() : base() { }

    public override IList<GenericSearchResponseDto> GetItems(IList<DreDoc> documents)
    {
        foreach (var doc in documents) 
        {
            var item = new GenericSearchResponseDto();

            item.IdDatabank = doc.Field.IdDatabank;
            item.IdDocMaster = doc.Field.IdDocMaster;
            item.DescDatabank = doc.Field.DescDatabank;
            item.Materie = doc.Field.MateriaAll.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
            item = setResponseParams(item, doc);

            items.Add(item);
        }

        return items;
    }

    public abstract GenericSearchResponseDto setResponseParams(GenericSearchResponseDto item, DreDoc doc);
}
公共抽象类SimpleResponseDtoBuilder:GenericResponseDtoMapper
{
公共SimpleResponseDtoBuilder():base(){}
公共覆盖IList GetItems(IList文档)
{
foreach(文档中的var文档)
{
var item=new GenericSearchResponseDto();
item.IdDatabank=doc.Field.IdDatabank;
item.IdDocMaster=doc.Field.IdDocMaster;
item.DescDatabank=doc.Field.DescDatabank;
item.matrie=doc.Field.materialAll.Split(新字符串[]{“|”},StringSplitOptions.RemoveEmptyEntries);
item=设置响应图(item,doc);
项目。添加(项目);
}
退货项目;
}
公共摘要GenericSearchResponseDto setResponseParams(GenericSearchResponseDto item,DreDoc文档);
}
最后是具体实施:

public class GiurisprudenzaResponseDtoBuilder : SimpleResponseDtoBuilder
{
    private HighlightHelper _highLightHelper;

    private const string _BR = @"<br/>";

    public GiurisprudenzaResponseDtoBuilder() : base() 
    {
        _highLightHelper = new HighlightHelper();
    }

    public override IList<GiurisprudenzaSearchResponseDto> GetItems(IList<DreDoc> documents)
    {
        return base.GetItems(documents);
    }

    public override GiurisprudenzaSearchResponseDto setResponseParams(GiurisprudenzaSearchResponseDto item, DreDoc doc)
    {

        item.IdUnitaDoc = doc.Field.IdUnitaDoc;

        ... some item.Something = doc.Something...

        return item;
    }
公共类GiurisprudenzaResponseDtoBuilder:SimpleResponseDtoBuilder
{
私人HighlightHelper\u HighlightHelper;
私有常量字符串\u BR=@“
”; public GiurisprudenzaResponseDtoBuilder():base() { _highLightHelper=新的highLightHelper(); } 公共覆盖IList GetItems(IList文档) { 返回基地。获取项目(文档); } 公共覆盖GiurisprudenzaSearchResponseDto setResponseParams(GiurisprudenzaSearchResponseDto项目,DreDoc文档) { item.IdUnitaDoc=doc.Field.IdUnitaDoc; …某个项目.Something=doc.Something。。。 退货项目; }

在C#中,将泛型类型传播到多个子类层的方法如下:

public TopClass<T> where T : GenericType{
}

public MiddleClass<T> : TopClass<T> where T : GenericType{
}

public BottomClass : MiddleClass<SpecificType>{
}
公共TopClass,其中T:GenericType{
}
公共中间类:顶级,其中T:GenericType{
}
公共底层阶级:中产阶级{
}

这个问题是试图在类型系统中解决太多业务问题的严重症状。即使你能让它工作,也没有人会理解类型之间的关系;如果它比“一篮子桔子,一篮子苹果”更复杂,那么未来的程序员将不容易理解。问问你自己“如果我没有泛型,我会用什么接口来解决这个问题?”让它来指导你的设计。