Код: Выделить всё
public class MyClass
{
public ReadOnlyCollection Values { get { return _valuesRO; } }
private readonly ObservableCollection _values;
private readonly ReadOnlyObservableCollection _valuesRO;
public MyClass()
{
_values = new();
_valuesRO = new(_values);
}
public void AddValue(string value)
{
_values.Add(value + ":");
}
}
public static class MyApp
{
public static void Main()
{
MyClass myClass = new();
myClass.AddValue("192"); //-> should work
Debug.Print(myClass.Values[0]); //-> should work
myClass.Values = new(); //-> should NOT work
myClass.Values.Add("192"); //-> should NOT work
}
}
Однако для каждой общедоступной коллекции требуется довольно много кода — два дополнительных поля и еще две строки. в конструкторе. Если мне понадобится много таких коллекций в моем классе, они очень быстро раздуются, ухудшив читаемость кода.
Учитывая, что решению, на которое я дал ссылку, уже 14 лет, есть ли способ добиться тот же функционал с меньшим количеством кода, желательно без дополнительных полей и ничего в конструкторе? Можно ли определить свой собственный производный класс, который абстрагировал бы это поведение? В идеале объявление и использование должны быть примерно такими:
Код: Выделить всё
public class MyClass
{
public MySpecialReadOnlyCollection Values { get; init; } = new();
public void AddValue(string value)
{
Values.Add(value + ":");
}
}
public static class MyApp
{
public static void Main()
{
MyClass myClass = new();
myClass.AddValue("192"); //-> should work
Debug.Print(myClass.Values[0]); //-> should work
myClass.Values = new(); //-> should NOT work
myClass.Values.Add("192"); //-> should NOT work
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... ified-only
Мобильная версия