Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Работа с интерфейсами и раелизацией


Автор: chip_and_dayl 14.10.2014, 17:40
Всем привет.

Нужно небольшое пояснение.
Есть интерфейс 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;
        }
    }

Автор: mihryak 14.10.2014, 18:16
Первый вариант использует class initializer, которому абсолютно всё равно, как ты объявишь переменную - хоть object; зная о классе и его свойствах, он даёт возможность проинициализировать всё, что возможно.

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

Код

var jsonObjectLocation = JsonConvert.SerializeObject(miInterface2);


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

Автор: Экскалупатор 15.10.2014, 10:58
можно так:
Код

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

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


IMHO
но, скорее всего это больше похоже на косяк, который может вылезти в дальнейшем. Кто то должен всегда помнить, что хоть класс и приходит откуда-то и десериализуется, но все равно в нем есть поля которые никак не заполняются в этом процессе и их кто то должен будет заполнить.

Автор: mihryak 15.10.2014, 11:05
Сериализатору тоже абсолютно не интересно, как ты объявил переменную - это, вообще, не так и много кого волнует. Свойства как были у экземпляра. так они и остались, а сериализатор твой, почти уверен, работает с публичными свойствами.
Судя по http://james.newtonking.com/json/help/index.html, ты можешь использовать JsonIgnoreAttribute или http://msdn.microsoft.com/en-us/library/z951x24h, чтобы исключить свойство из сериализации.

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

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

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



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

Код

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

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

Автор: chip_and_dayl 15.10.2014, 11:36
Всем спасибо:)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)