2010-08-11 43 views
3

我有一個對象,我從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,如果我可以避開它的話。

回答

2

這聽起來像你想Lazy<T>它構造與在一個Tuple<Bar, Bar2>意願工作都值的複合對象:

public Bar Prop3 { get { return lazy.Value.Item1; } } 
public Bar2 Prop4 { get { return lazy.Value.Item2; } } 

private readonly Lazy<Tuple<Bar, Bar2>> lazy = 
    new Lazy<Tuple<Bar, Bar2>>(LoadDetailedInformation); 

private Tuple<Bar, Bar2> LoadDetailedInformation() 
{ 
    ... 
} 

當然,代替Tuple你可以有一個DetailedResponse類型 - 我建議,如果你最終有超過幾個屬性。實際上,您希望懶惰地獲取詳細的響應,然後提供對其中各個屬性的簡化訪問。

1

懶惰只得到你要的是什麼,所以問他們在一起......

public class Foo 
{ 
    public Guid ID { get; set; } 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 
    public Lazy<SubFoo> SubFoo{ get; } 
} 

public class SubFoo 
{ 
    public IEnumerable<Bar> Prop3 { get; } 
    public IEnumerable<Bar2> Prop4 { get; } 
}