7

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

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

1 回答 1

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

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

于 2012-11-27T19:14:35.670 回答