none
защитить элементы массива, свойства от изменения. RRS feed

  • Вопрос

  • есть приложение

    есть библиотека1 классы хранящие некоторые свойства типа: string,int и т.д., а так же типа IList <class_from_lib1> 

    есть библиотека2 может использовать классы из библиотеки1.

    Вопрос1: как защитить свойства объектов созданных на основе классов бибилиотеки1, чтобы:

    1. приложение могло ментяь любые свойства и добавлять/изменять элементы IList<>  бибилиотеки1.

    2. библиотека2 могла только читать свойства библиотеки1 и никоим образом не могла их менять. (включая отдельные элементы Ilist<> и тем более добавлять.)

    в библиотеке1 у меня создан статический класс, в котором и хранятся объекты созданные на основе классов библиотеки1. Через этот класс библиотека2 может получать данные свойств классов  библиотеки1.

    -------------------------------------------------------------------------------------------------------------------------------

    Вопрос2: как сделать разрешить записать приожению объекты классов библиотеки1 в статический класс,  и не дать это сделать библиотеке2?

    сейчас я в статик классе это делаю ч/з метод Init() в котором стоит простое условие: если свойство=null то изменяем иначе нет.

    26 сентября 2012 г. 4:30

Ответы

  • Ответ на первый и второй вопросы:

    public class MyClass { private string myProperty; public string MyProperty {

    //Читать могут все. public get { return myProperty; }

    //Писать только типы из текущей сборки. internal set { myProperty = value;} } }

    Тоже самое касается и списка List, инкапсулируйте его в отдельный класс, с уровнем доступа internal.

    • Предложено в качестве ответа Geokish 26 сентября 2012 г. 8:23
    • Помечено в качестве ответа YatajgaEditor 29 сентября 2012 г. 5:54
    26 сентября 2012 г. 5:46
    Модератор
  • Можете использовать дружественные сборки, если хотите чтобы ваше приложение имело доступ, а другоие нет.
    • Предложено в качестве ответа Abolmasov Dmitry 26 сентября 2012 г. 13:09
    • Помечено в качестве ответа YatajgaEditor 29 сентября 2012 г. 5:54
    26 сентября 2012 г. 9:39
    Модератор

Все ответы

  • Ответ на первый и второй вопросы:

    public class MyClass { private string myProperty; public string MyProperty {

    //Читать могут все. public get { return myProperty; }

    //Писать только типы из текущей сборки. internal set { myProperty = value;} } }

    Тоже самое касается и списка List, инкапсулируйте его в отдельный класс, с уровнем доступа internal.

    • Предложено в качестве ответа Geokish 26 сентября 2012 г. 8:23
    • Помечено в качестве ответа YatajgaEditor 29 сентября 2012 г. 5:54
    26 сентября 2012 г. 5:46
    Модератор
  • спасибо!
    26 сентября 2012 г. 6:40
  • Похоже ничего не получилось..

    м.б. я как то не так проект создал?

    у меня есть Решение с двумя проектами.

    один проект собственно приложение

    второй проект "библиотека классов".

    второй проект "библиотека классов" планируется использовать в других библиотеках для чтения некоторых данных.

    а приложение должно формировать эти данные.

    // в проекте "бибилиотека классов"
        public class MItem
        {
            protected DateTime _lastchange = DateTime.MinValue;
            public DateTime LastChange { get { return _lastchange; } internal set { _lastchange = value; } }
            public MItem() { }
        }
    //  в проекте приложения:
    MItem item = new MItem();
    item.LastChange=DateTime.Now;

    получаю ошибку:

    Ошибка 1 Невозможно присвоить значение свойству или индексатору "....LastChange" -- доступ только для чтения 
    • Изменено anknown123455 26 сентября 2012 г. 9:34
    26 сентября 2012 г. 9:34
  • "Невозможно присвоить значение свойству или индексатору "....LastChange" -- доступ только для чтения " - насколько я понял из первого вопроса, Вы так и хотели.
    26 сентября 2012 г. 9:37
    Модератор
  • Можете использовать дружественные сборки, если хотите чтобы ваше приложение имело доступ, а другоие нет.
    • Предложено в качестве ответа Abolmasov Dmitry 26 сентября 2012 г. 13:09
    • Помечено в качестве ответа YatajgaEditor 29 сентября 2012 г. 5:54
    26 сентября 2012 г. 9:39
    Модератор
  • Это скорей всего решит вашу проблему. Не забудьте отметить ответ с помощью кнопки "Пометить как ответ" после того как проверите и решение вам подойдет. Спасибо.

    Для связи [mail]

    26 сентября 2012 г. 13:10