Как использовать System.Lazy с Setter для Lazy Инициализация списка в объектах POCO? - PullRequest
18 голосов
/ 27 июля 2011

Я хочу использовать System.Lazy to Lazy Initialization моего Списка в моих Entites:

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

Проблема в моем SETTER, получите эту ошибку: Свойство 'System.Lazy<T>.Value'не имеет установщика

Если я хочу сделать 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 } }

Я что-то не так делаю?

Ответы [ 3 ]

25 голосов
/ 27 июля 2011

Вы можете сделать что-то вроде этого:

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

Однако я не понимаю, зачем вам вообще нужен Lazy<T> здесь. Нет смысла в его использовании, потому что инициализация нового List<T> должна совпадать с инициализацией нового Lazy<T> ...

Я думаю, этого было бы достаточно, чтобы все было так просто:

* * 1010

или

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

    public IList<Question> Questions { get; set; }
}
5 голосов
/ 27 июля 2011

Не ясно, что вы пытаетесь сделать.Вы не можете установить значение 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; } }
}
2 голосов
/ 12 ноября 2012

Не ленивое решение - то же самое преимущество с точки зрения инициализации только при вызове:

    private List<Question> _questions;
    public List<Question> Questions { get { return _questions ?? (_questions = new List<Question>()); } set { _questions = value; } }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...