我有一個對象,我從web服務的響應中創建。如果我得到這些對象的列表,它們的信息量最小(在下面的示例中,ID,Prop1和Prop2在列表響應中返回)。如果我通過ID獲取對象,則會返回完整的一組信息,包括Prop3和Prop4中的子對象。手動設置懶惰值<T>
public class Foo
{
public Guid ID { get; set; }
public string Prop1 { get; set; }
public string Prop2 { get; set; }
public Lazy<IEnumerable<Bar>> Prop3 { get; }
public Lazy<IEnumerable<Bar2>> Prop4 { get; }
}
我希望能夠做的就是使用這個對象時部分構造,但如果Prop3或Prop4進行訪問,請對Web服務調用下載更詳細的數據集,並填寫雙方Prop3和Prop4 。
如果我使用Lazy,那麼我只能通過訪問它來單獨填充每個屬性。這會導致相同的webservice調用,每次只解析一小部分響應。我希望能夠做的就是創建每個懶惰像這樣:
Prop3 = new Lazy<IEnumerable<Foo>>(() => LoadDetailedInformation());
private void LoadDetailedInformation()
{
// Get info from web service
Prop3.Value = ParseProp3(response);
Prop4.Value = ParseProp4(response);
}
在這個假裝懶惰的實施
所以,當慵懶的對象被訪問函數會被調用,但實際上不會返回數據。它會執行一些計算並立即初始化所有惰性值。
我最好只是滾動我自己的Lazy,還是有另一種方法來做到這一點,而不寫每個屬性的大量包裝代碼?我這樣做的一個類有大約20個需要這樣包裝的對象,所以我不想寫出實際的getter和setter,如果我可以避開它的話。