Есть ли более простой способ создать ObservableCollection, которую можно будет изменить только внутри того же класса?C#

Место общения программистов C#
Ответить
Anonymous
 Есть ли более простой способ создать ObservableCollection, которую можно будет изменить только внутри того же класса?

Сообщение Anonymous »

Часто мне нужна ObservableCollection, доступная только для чтения (чтобы ее ссылку или содержимое можно было изменить только внутри этого класса). Мне нужен ObservableCollection, потому что я буду привязываться к этому свойству с помощью WPF (не показано в коде ниже). Это полностью воспроизводимый рабочий пример, который показывает мои намерения:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»