代码之家  ›  专栏  ›  技术社区  ›  Jamie Penney

手动设置Lazy的值<T>

  •  3
  • Jamie Penney  · 技术社区  · 15 年前

    我有一个从webservice的响应创建的对象。如果我得到这些对象的列表,它们的信息量就很小(在下面的示例中,ID、Prop1和Prop2在list响应中返回)。如果通过ID获取对象,则返回完整的信息集,包括Prop3和Prop4中的子对象。

    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,请调用webservice下载更详细的数据集并填充Prop3和Prop4。

    Prop3 = new Lazy<IEnumerable<Foo>>(() => LoadDetailedInformation());
    
    private void LoadDetailedInformation()
    {
        // Get info from web service
        Prop3.Value = ParseProp3(response);
        Prop4.Value = ParseProp4(response);
    }
    

    因此,在这个Lazy的假装实现中,当访问Lazy对象时会调用函数,但实际上不会返回数据。它将执行一些计算并一次初始化所有延迟值。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Jon Skeet    15 年前

    听起来你想要一个 单一的 Lazy<T> 中的值。A 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 类型-我建议,如果你最终有超过几个属性。实际上,您希望懒洋洋地获得详细的响应,然后提供对其中各个属性的简化访问。

        2
  •  1
  •   µBio    15 年前

    懒惰只会得到你想要的,所以一起去要求他们。。。

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