Как использовать System.Lazy с сеттером для ленивой инициализации списка в объектах POCO?
Я хочу использовать System.Lazy для ленивой инициализации моего списка в моих 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> { ... }
?
Как мне продолжить?
Update:
Я пытаюсь избежать этого:
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 } }
Я делаю что-то неправильно?
Ответы
Ответ 1
Вы можете сделать что-то вроде этого:
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>
...
Я думаю, этого было бы достаточно, чтобы это было так просто:
public class Questionary
{
private IList<Question> _questions = new List<Question>();
public IList<Question> Questions
{
get { return _questions; }
set { _questions = value; }
}
}
или
public class Questionary
{
public Questionary()
{
Questions = new List<Question>();
}
public IList<Question> Questions { get; set; }
}
Ответ 2
Не понятно, что вы пытаетесь сделать. Вы не можете установить значение 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; } }
}
Ответ 3
Неладовое решение - такое же преимущество при инициализации только при вызове:
private List<Question> _questions;
public List<Question> Questions { get { return _questions ?? (_questions = new List<Question>()); } set { _questions = value; } }