Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с интерфейсами и раелизацией 
V
    Опции темы
chip_and_dayl
Дата 14.10.2014, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 603
Регистрация: 22.4.2007
Где: Украина, Киев

Репутация: нет
Всего: 9



Всем привет.

Нужно небольшое пояснение.
Есть интерфейс IMyInterface в котором объявлено одно поле X.
Есть реализация интерфейса Class1, который содержит данное поле X + добавлено поле с именем Y.

И есть Class2 в котором в методе My создаются экземпляры класса.
В первом случае есть доступ к полю Y, хотя не должно быть? Во втором случае нет доступа как и ожидалось.

В чем проблема?

Код

internal interface IMyInterface
    {
        int X { get; set; }
    }

    class Class1 : IMyInterface
    {
        public int X { get; set; }
        public int Y { get; set; }

    }

    class Class2
    {
        public void My()
        {
            IMyInterface miInterface = new Class1
            {
                Y = 45
            };

            IMyInterface miInterface2 = new Class1();
            // нет доступа к полю
            miInterface2.Y;
        }
    }



--------------------
Фсё будет хорошо!!!
PM MAIL Skype   Вверх
mihryak
Дата 14.10.2014, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Первый вариант использует class initializer, которому абсолютно всё равно, как ты объявишь переменную - хоть object; зная о классе и его свойствах, он даёт возможность проинициализировать всё, что возможно.
PM MAIL ICQ   Вверх
chip_and_dayl
Дата 15.10.2014, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 603
Регистрация: 22.4.2007
Где: Украина, Киев

Репутация: нет
Всего: 9



А как тогда можно сделать так, что бы при сериализации объекта, поле Y было скрыто?

Код

var jsonObjectLocation = JsonConvert.SerializeObject(miInterface2);


Добавлено через 2 минуты и 38 секунд
Очень нужно скрыть это поле. Иначе держу два класса с разными наборами полей:(


--------------------
Фсё будет хорошо!!!
PM MAIL Skype   Вверх
Экскалупатор
Дата 15.10.2014, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



можно так:
Код

class Class1 : IMyInterface
    {
        public int X { get; set; }

        [JsonIgnore]
        public int Y { get; set; }
    }


IMHO
но, скорее всего это больше похоже на косяк, который может вылезти в дальнейшем. Кто то должен всегда помнить, что хоть класс и приходит откуда-то и десериализуется, но все равно в нем есть поля которые никак не заполняются в этом процессе и их кто то должен будет заполнить.
PM MAIL ICQ   Вверх
mihryak
Дата 15.10.2014, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Сериализатору тоже абсолютно не интересно, как ты объявил переменную - это, вообще, не так и много кого волнует. Свойства как были у экземпляра. так они и остались, а сериализатор твой, почти уверен, работает с публичными свойствами.
Судя по документации, ты можешь использовать JsonIgnoreAttribute или NonSerializedAttribute, чтобы исключить свойство из сериализации.

Опоздал smile
Согласен, что попахивает чем-то дурным.

Это сообщение отредактировал(а) mihryak - 15.10.2014, 11:07
PM MAIL ICQ   Вверх
Экскалупатор
Дата 15.10.2014, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



[NonSerialized] не работает с свойствами, ему нужны переменные. 
По крайней мере у меня ругается, если так написать:
Код

        [NonSerialized]
        public int Y { get; set; }



для свойств еще подойдет [DataContract]/[DataMember]

Код

    [DataContract]
    class Class1 : IMyInterface
    {
        [DataMember]
        public int X { get; set; } // сериализуется

        public int Y { get; set; } // не сериализуется
    }

PM MAIL ICQ   Вверх
chip_and_dayl
Дата 15.10.2014, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 603
Регистрация: 22.4.2007
Где: Украина, Киев

Репутация: нет
Всего: 9



Всем спасибо:)


--------------------
Фсё будет хорошо!!!
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0737 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.