如何将Set.Lazy与Setter一起使用到POCO实体中列表的延迟初始化?

Aca*_*uza 18 .net c# entity-framework lazy-initialization c#-4.0

我想在我的Entites中使用System.Lazy来懒惰初始化我的列表:

public class Questionary
{
    private Lazy<List<Question>> _questions = new Lazy<List<Question>>(() => new List<Question>());

    public IList<Question> Questions { get { return _questions.Value; } set { _questions.Value = value; } }
}
Run Code Online (Sandbox Code Playgroud)

问题出在我的SETTER上,得到这个错误:属性' System.Lazy<T>.Value'没有setter

如果我想做MyInstance.Questions = new List<Question> { ... }

我该怎么办?

更新:

我试图避免这种情况:

private IList<Question> _questions;

//Trying to avoid that ugly if in my getter:
public IList<Question> Questions { get { return _questions == null ? new List<Question>() : _questions; } set { _questions = value } }
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

Dan*_*rth 25

你可以这样做:

public class Questionary
{
    private Lazy<IList<Question>> _questions = 
        new Lazy<IList<Question>>(() => new List<Question>());

    public IList<Question> Questions
    {
        get { return _questions.Value; }
        set { _questions = new Lazy<IList<Question>>(() => value); }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我不明白为什么你需要Lazy<T>这里.使用它没有任何好处,因为新的初始化List<T>应该与新的初始化相同Lazy<T>...

我认为保持它就像这样简单就足够了:

public class Questionary
{
    private IList<Question> _questions = new List<Question>();

    public IList<Question> Questions
    {
        get { return _questions; }
        set { _questions = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

public class Questionary
{
    public Questionary()
    {
        Questions = new List<Question>();
    }

    public IList<Question> Questions { get; set; }
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 5

目前尚不清楚你要做什么.你不能设置a的值Lazy<T>- 就这么简单.您只能它请求一个值,它将执行您在第一次请求值时提供的委托.

你真的需要班上的二传手吗?也许你只想要:

public class Questionary
{
    private Lazy<List<Question>> _questions = 
        new Lazy<List<Question>>(() => new List<Question>());

    public IList<Question> Questions { get { return _questions.Value; } }
}
Run Code Online (Sandbox Code Playgroud)

  • @JonSkeet:我也有这个问题,我之所以想要一个setter和一个懒惰的加载是这样的:我有Person对象,每个Person都有一个Address.我经常希望将Person对象用于其Id和Name,并在需要时将Address设置为从数据库延迟加载.但我也有一个视图,我需要显示一个人的列表与他们的地址,在这种情况下,我用一个连接在一个sql语句中获取所有人和他们的地址,我想初始化每个人和他的/她的地址,并且没有地址延迟加载,每次都进行数据库调用. (9认同)