我正在構建一個類似於此的通用平面文件閱讀器。我能否以某種方式整理這種(過度使用?)仿製藥?
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; }
}
你可能要檢查出[代碼審查SE(http://codereview.stackexchange.com/)。它真的更適合這樣的評論任務。 – tmesser
我認爲這個問題符合SO;它不是一個代碼審查,它主要依賴的泛型類型參數的相互依存問題(和類型系統的談話絕對是話題的SO),並簡化了它.. – 2012-11-27 18:57:59
對我的方式,你GenericReader聽起來更像是一個工廠然後是一個泛型類型,除非我失去了一些東西。聽起來像你會創建它只是爲了在之後處理它。那麼除了提供Composite之外,是否還有GenericReader存在的原因呢?複合材料是否有一些靜態方法來生成它自己的實例? – LightStriker