我正在构建一个通用的平面文件阅读器,看起来像这样。
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; }
}
答案 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();
您仍然可以使用具有通用参数的类型用于高度专业化的案例,但对于常见用例(通过分析/领域知识确定),您可以确定最常见的参数并提供类设置类型参数以协助。