Ограничение доступа к элементом словаря, являющемуся свойств
От: CyberRussia  
Дата: 26.06.21 17:57
Оценка:
Добрый день,

public class MyClass {
    public class MyData {
        public int Parm {get;set;}
        public int Calc {get;set;}
    }
    protected Dictionary<MyData> workData = new Dictionary<MyData>();

    public void Calculate(){...}

    protected void Change(){...}

    public Dictionary<...> DataSource {get{...};set{...};}
}


Класс содержит в себе словарь с данными, над которыми работает. Каждый элемент содержит два свойства — Parm и Calc. С другими классами обмен данных идет, через свойство DataSource, которое так-же является словарем и так-же каждый элемент содержит свойства Parm и Calc. Данные внутреннего словаря и словаря свойства класса — совпадают.
Однако:
1. При обращении к элементам словаря из-за пределов класса MyClass — свойство Calc должно быть доступно только для чтения.
2. Изменение значения свойства Parm и / или количества элементов в словаре должно автоматически (силами класса MyClass) вызывать срабатывание метода Change.

Как такое реализовать?
Отредактировано 23.07.2021 15:15 VladD2 . Предыдущая версия .
Re: Ограничение доступа к элементом словаря, являющемуся свойством класса
От: CyberRussia  
Дата: 26.06.21 18:15
Оценка:
CR> protected Dictionary<MyData> workData = new Dictionary<MyData>();
Опечатался, имелось в виду:
protected Dictionary<int, MyData>...
Re: Ограничение доступа к элементом словаря, являющемуся свойством класса
От: Xander Zerge Россия www.zerge.com
Дата: 26.06.21 23:18
Оценка: 3 (1) +1
Здравствуйте, CyberRussia, Вы писали:

CR>1. При обращении к элементам словаря из-за пределов класса MyClass — свойство Calc должно быть доступно только для чтения.


CR>Как такое реализовать?


Например так:
public class MyData
{
    public int Parm { get; set; }
    public int Calc { get; protected set; }
}

private class MyCalcData : MyData
{
    public new int Calc { get => base.Calc; set => base.Calc = value; }
}

Внутри оперируешь объектами типа MyCalcData, а снаружи они видны как MyData.

CR>2. Изменение значения свойства Parm и / или количества элементов в словаре должно автоматически (силами класса MyClass) вызывать срабатывание метода Change.


Для Parm поступаешь также — в MyCalcData — переопределяешь поведение Parm.

Для количества элементов в словаре — история отдельная. Так в лоб не получится. Придётся делать обёртку над словарём, реализующую его интерфейс(ы), или использовать готовую, или свои методы работы со словарём предоставлять, или ещё что может другое — тут по конкретной задаче надо смотреть.
Серёжа Новиков,
программист
Re: Ограничение доступа к элементом словаря, являющемуся свойством класса
От: karbofos42 Россия  
Дата: 27.06.21 07:15
Оценка:
Здравствуйте, CyberRussia, Вы писали:

CR>1. При обращении к элементам словаря из-за пределов класса MyClass — свойство Calc должно быть доступно только для чтения.


вынести в отдельный проект и для set прописать internal
либо выделить интерфейс IMyData с нужными свойствами и наружу его выставлять, а внутри MyClass кастовать к MyData по мере необходимости.

CR>2. Изменение значения свойства Parm и / или количества элементов в словаре должно автоматически (силами класса MyClass) вызывать срабатывание метода Change.


CR>Как такое реализовать?


В MyData реализовать INitifyPropertyChanged или просто отдельное событие сделать, а в MyClass подписываться на события от элементов и вызывать Change.
Для словаря сделать что-то типа ObservableDictionary, который так же будет уведомлять об изменении (INotifyCollectionChanged или опять же своё событие).

В целом задача выглядит странно, подозреваю, что уже с этими словарями выбрано не лучшее решение и они только усложнят жизнь.
Re[2]: Ограничение доступа к элементом словаря, являющемуся свойством класса
От: CyberRussia  
Дата: 27.06.21 09:47
Оценка:
Здравствуйте, karbofos42, Вы писали:
K>В целом задача выглядит странно, подозреваю, что уже с этими словарями выбрано не лучшее решение и они только усложнят жизнь.

Словарь потому что он дает высокую скорость доступа на выборку / чтение по идентификатору отдельного элемента. И позволяет отображать себя и редактировать в гриде GUI без особых проблем. Сразу хочу сказать, что вариант ограничиться запретом на редактирование в гриде GUI отдельного столбца недостаточен.
Re: Ограничение доступа к элементом словаря, являющемуся свойством класса
От: Qulac Россия  
Дата: 27.06.21 09:57
Оценка: +1
Здравствуйте, CyberRussia, Вы писали:

CR>Добрый день,


CR>public class MyClass {

CR> public class MyData {
CR> public int Parm {get;set;}
CR> public int Calc {get;set;}
CR> }
CR> protected Dictionary<MyData> workData = new Dictionary<MyData>();

CR> public void Calculate(){...}


CR> protected void Change(){...}


CR> public Dictionary<...> DataSource {get{...};set{...};}

CR>}

CR>Класс содержит в себе словарь с данными, над которыми работает. Каждый элемент содержит два свойства — Parm и Calc. С другими классами обмен данных идет, через свойство DataSource, которое так-же является словарем и так-же каждый элемент содержит свойства Parm и Calc. Данные внутреннего словаря и словаря свойства класса — совпадают.

CR>Однако:
CR>1. При обращении к элементам словаря из-за пределов класса MyClass — свойство Calc должно быть доступно только для чтения.
CR>2. Изменение значения свойства Parm и / или количества элементов в словаре должно автоматически (силами класса MyClass) вызывать срабатывание метода Change.

CR>Как такое реализовать?


Можно поменять местами MyData и MyClass, вложенный класс имеет доступ к приватным полям включающего класса.
public class MyData
    {
        public int Parm { get; set; }
        public int Calc { get; private set; }

        public class MyClass
        {

            protected Dictionary<int, MyData> workData = new Dictionary<int, MyData>();

            public void Calculate() { }

            protected void Change() { }

            public Dictionary<int, MyData> DataSource
            {
                get
                {
                    return workData;
                }
                set
                {
                    workData = value;
                    workData[0].Calc = 30;
                }
            }
        }
    }

Программа – это мысли спрессованные в код
Re[3]: Ограничение доступа к элементом словаря, являющемуся свойством класса
От: karbofos42 Россия  
Дата: 27.06.21 18:45
Оценка: +1
Здравствуйте, CyberRussia, Вы писали:

CR>Здравствуйте, karbofos42, Вы писали:

K>>В целом задача выглядит странно, подозреваю, что уже с этими словарями выбрано не лучшее решение и они только усложнят жизнь.

CR>Словарь потому что он дает высокую скорость доступа на выборку / чтение по идентификатору отдельного элемента. И позволяет отображать себя и редактировать в гриде GUI без особых проблем. Сразу хочу сказать, что вариант ограничиться запретом на редактирование в гриде GUI отдельного столбца недостаточен.


для грида можно и IEnumerable отдавать, ему доступ по индексу не нужен, а для доступа по индексу отдельное свойство-индексатор завести.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.