C# 我能不能整理一下这种(过度使用的?)仿制药?

C# 我能不能整理一下这种(过度使用的?)仿制药?,c#,design-patterns,generics,types,C#,Design Patterns,Generics,Types,我正在构建一个通用的平面文件阅读器,它看起来像这样 public class GenericReader<TComposite, THeader, TData, TTrailer> where TComposite : GenericComposite<THeader, TData, TTrailer>, new() where THeader : new() where TData : new() where TTrailer : n

我正在构建一个通用的平面文件阅读器,它看起来像这样

 public class GenericReader<TComposite, THeader, TData, TTrailer> 
    where TComposite : GenericComposite<THeader, TData, TTrailer>, new()
    where THeader : new()
    where TData : new()
    where TTrailer : new()
{
    public TComposite Read()
    {
        var composite = new TComposite();

        composite.Header = new THeader();
        composite.Data = new TData();
        composite.Trailer = new TTrailer();

        return composite;
    }        
}
公共类GenericReader
其中TComposite:GenericComposite,new()
where THeader:new()
其中TData:new()
其中TTrailer:new()
{
公共TComposite Read()
{
var composite=新的TComposite();
composite.Header=newtheader();
composite.Data=newtdata();
composite.Trailer=newttrailer();
收益组合;
}        
}
可以这样消费

var reader = new GenericReader<Composite<Header, Data, Trailer>, Header, Data, Trailer> ();

var composite = reader.Read();
Console.WriteLine(composite.Data.SomeProperty);

Console.ReadLine();
var reader=newgenericreader();
var composite=reader.Read();
Console.WriteLine(composite.Data.SomeProperty);
Console.ReadLine();
下面是使用的类

public class Composite<THeader, TData, TTrailer> : GenericComposite<THeader, TData, TTrailer>
{

}

public class GenericComposite<THeader, TData, TTrailer>
{
    public THeader Header { get; set; }

    public TData Data { get; set; }

    public TTrailer Trailer { get; set; }
}

public class Header {
    public string SomeProperty { get { return "SomeProperty"; } } 
}

public class Data {
    public string SomeProperty { get { return "SomeProperty"; } } 
}

public class Trailer {
    public string SomeProperty { get { return "SomeProperty"; } } 
}
公共类复合:GenericComposite
{
}
公共类泛型复合
{
公共THeader头{get;set;}
公共TData数据{get;set;}
公共TTrailer拖车{get;set;}
}
公共类标题{
公共字符串SomeProperty{get{返回“SomeProperty”;}
}
公共类数据{
公共字符串SomeProperty{get{返回“SomeProperty”;}
}
公共级拖车{
公共字符串SomeProperty{get{返回“SomeProperty”;}
}
有没有办法在GenericReader中删除或封装泛型类型信息?我正在寻找一双额外的眼睛,让我看到我所缺少的东西。我们已经做了一些事情,返回接口,让消费者做一个演员,但在我看来,这只是把责任转移到了错误的位置,另外还有一个小的性能损失

谢谢

编辑:我不需要TComposite,我只需要返回GenericComposite。我怎么会错过呢

public class GenericReader<THeader, TData, TTrailer> 
    where THeader : new()
    where TData : new()
    where TTrailer : new()
{
    public GenericComposite<THeader, TData, TTrailer> Read()
    {
        var composite = new GenericComposite<THeader, TData, TTrailer>();

        composite.Header = new THeader();
        composite.Data = new TData();
        composite.Trailer = new TTrailer();

        return composite;
    }        
}

public class GenericComposite<THeader, TData, TTrailer>
{
    public THeader Header { get; set; }

    public TData Data { get; set; }

    public TTrailer Trailer { get; set; }
}
公共类GenericReader
where THeader:new()
其中TData:new()
其中TTrailer:new()
{
公共泛型复合读取()
{
var composite=新的GenericComposite();
composite.Header=newtheader();
composite.Data=newtdata();
composite.Trailer=newttrailer();
收益组合;
}        
}
公共类泛型复合
{
公共THeader头{get;set;}
公共TData数据{get;set;}
公共TTrailer拖车{get;set;}
}

无法消除对泛型约束上类型声明的需要

但是,您的用例表明这是最常见的行为:

var reader = new GenericReader<Composite<Header, Data, Trailer>, 
    Header, Data, Trailer>();

对于高度专业化的用例,您仍然可以使用带有泛型参数的类型,但对于常见用例(通过分析/领域知识确定),您可以确定最常见的用例,并为类提供设置类型参数的帮助。

您可能想查看。它确实更适合像这样的复习任务;这与其说是一个代码审查,不如说是一个关于泛型类型参数相互依赖性的问题(类型系统对话肯定是so中的主题)以及简化它的方法……对我来说,你的泛型阅读器听起来更像一个工厂,而不是泛型类型,除非我遗漏了什么。听起来您创建它只是为了在之后立即处理它。那么,除了提供一个组合外,GenericReader的存在还有什么原因吗?合成不能有一些静态方法来生成自己的实例吗?很抱歉,我不同意,但我喜欢使用接口,至少对于Read()这样的方法,因为它可以确保Read方法在处理各种用例/边缘情况时不会膨胀到地狱。也就是说,我也同意你的观点,这是泛型地狱。我想我会尝试在没有任何泛型的情况下实现一些实例,以便更好地了解边在哪里,泛型在哪里增加了价值,以及在不牺牲灵活性的情况下可以用特定的实现替换它们。@lightstriker在实际实现中还有很多事情要做。这就是我现在正在做的。应该把它添加到问题中。相当理智的解决方案@JefClaes我最近遇到了一个情况,我有三个通用参数,两个是常规用例,我发现为继承的参数提供预定义的类型参数(我推荐的)对我来说是最好的。也许是偶然的。
public class Composite : GenericComposite<Header, Data, Trailer> { }

public class GenericReader : GenericReader<
    Composite, Header, Data, Trailer>
{ }
var reader = new GenericReader();

var composite = reader.Read();

Console.WriteLine(composite.Data.SomeProperty);

Console.ReadLine();