我可以以某种方式整理这种(过度使用?)的仿制药吗?

时间:2012-11-27 18:48:04

标签: 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 : new()
{
    public TComposite Read()
    {
        var composite = new TComposite();

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

        return composite;
    }        
}

可以像这样消费。

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

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"; } } 
}

有没有办法在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; }
}

1 个答案:

答案 0 :(得分:2)

没有办法消除对通用约束的类型声明的需要。

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

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

如果是这种情况,您可以对使用某些模式的频率进行假设,则可以从具有闭合类型定义的泛型类继承一个类型(或一组类型),这些类型定义可以更容易地使用。

在上述情况下,您可以为基本,最常见的情况(除了通用定义)提供这些类:

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();

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