Можно ли сделать один класс?
От: Passerby  
Дата: 27.01.21 10:01
Оценка:
С сервера в json приходят данные, которые в зависимости от метода запроса после десериализации записываются в:
    public class OrderBookREST
    {
        public List<BidDelta> bid { get; set; }
        public List<AskDelta> ask { get; set; }
        public int sequence { get; set; }
    }

или при другом методе запроса в:
    public class OrderBookSocket
    {
        public List<BidDelta> bidDeltas { get; set; }
        public List<AskDelta> askDeltas { get; set; }
        public int sequence { get; set; }
    }

в дальнейшем код работы с классами одинаков. Можно ли как-то атрибутами сделать один класс?
Отредактировано 04.02.2021 23:33 VladD2 . Предыдущая версия . Еще …
Отредактировано 27.01.2021 12:53 Passerby . Предыдущая версия .
Re: Можно ли сделать один класс?
От: Farsight СССР  
Дата: 27.01.21 11:01
Оценка: 2 (1)
Здравствуйте, Passerby, Вы писали:

Первое, что пришло в голову: пропишите в класс все варианты для правильной десирализации и добавьте новое свойство, типа:

[JsonIgnore]
public List<BidDelta> Bids => bid ?? bidDeltas;
</farsight>
Отредактировано 27.01.2021 11:04 Farsight . Предыдущая версия . Еще …
Отредактировано 27.01.2021 11:02 Farsight . Предыдущая версия .
Re[2]: Можно ли сделать один класс?
От: Passerby  
Дата: 27.01.21 11:59
Оценка:
Здравствуйте, Farsight, Вы писали:

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


F>Первое, что пришло в голову: пропишите в класс все варианты для правильной десирализации и добавьте новое свойство, типа:


F>
F>[JsonIgnore]
F>public List<BidDelta> Bids => bid ?? bidDeltas;
F>

Спасибо. Кажется можно и оставить название свойства одним из существующих, к примеру:
bid => bid ?? bidDeltas;

Как считаете?
Отредактировано 27.01.2021 12:05 Passerby . Предыдущая версия . Еще …
Отредактировано 27.01.2021 12:04 Passerby . Предыдущая версия .
Отредактировано 27.01.2021 11:59 Passerby . Предыдущая версия .
Re[3]: Можно ли сделать один класс?
От: Farsight СССР  
Дата: 27.01.21 12:04
Оценка:
Здравствуйте, Passerby, Вы писали:

P>Спасибо. Кажется можно и оставить название свойства одним из существующих, к примеру:

P>
P>bid => bid ?? bidDeltas;
P>

P>Как считаете?

Не получится .
</farsight>
Re[4]: Можно ли сделать один класс?
От: Passerby  
Дата: 27.01.21 12:15
Оценка:
Здравствуйте, Farsight, Вы писали:

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


P>>Спасибо. Кажется можно и оставить название свойства одним из существующих, к примеру:

P>>
P>>bid => bid ?? bidDeltas;
P>>

P>>Как считаете?

F>Не получится .


Все равно не получается. Надо чтобы в классе были оба свойства:
public class OrderBookExample
    {
        public List<BidDelta> bid { get; set; }//если закомментировать пишет "Имя bid не существует в текущем контексте"
        public List<BidDelta> bidDeltas { get; set; }

        [JsonIgnore]
        public List<BidDelta> Bids => bid ?? bidDeltas;
    }

А хотелось бы один класс с тем же числом свойств.
Отредактировано 27.01.2021 12:19 Passerby . Предыдущая версия . Еще …
Отредактировано 27.01.2021 12:16 Passerby . Предыдущая версия .
Re[5]: Можно ли сделать один класс?
От: Farsight СССР  
Дата: 27.01.21 12:24
Оценка: 1 (1) +1
Здравствуйте, Passerby, Вы писали:

P>А хотелось бы один класс с тем же числом свойств.


Ну это подход "в лоб". Если сильно хочется, то возьмите Json.NET и напишите кастомный конвертер. В интеренетах есть примеры.
</farsight>
Re: Можно ли сделать один класс?
От: Ночной Смотрящий Россия  
Дата: 27.01.21 12:41
Оценка:
Здравствуйте, Passerby, Вы писали:

P>С сервера в json приходят данные, которые в зависимости от метода запроса после сериализации записываются в:

P>public class OrderBookREST
P> {
P> public List<BidDelta> bid { get; set; }
P> public List<AskDelta> ask { get; set; }
P> public int sequence { get; set; }
P> }
P>или при другом методе запроса в:

P>public class OrderBookSocket

P> {
P> public List<BidDelta> bidDeltas { get; set; }
P> public List<AskDelta> askDeltas { get; set; }
P> public int sequence { get; set; }
P> }
P>в дальнейшем код работы с классами одинаков. Можно ли как-то атрибутами сделать один класс?

Какими атрибутами? Что мешает просто использовать один класс? Какой именно сериализатор имеется в виду?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[6]: Можно ли сделать один класс?
От: Passerby  
Дата: 27.01.21 12:48
Оценка:
Здравствуйте, Farsight, Вы писали:

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


P>>А хотелось бы один класс с тем же числом свойств.


F>Ну это подход "в лоб". Если сильно хочется, то возьмите Json.NET и напишите кастомный конвертер. В интеренетах есть примеры.

Создал для примера:
public class OrderBookExample1
    {
        public string bid { get; set; }
        public string bidDeltas { get; set; }
        [JsonIgnore]
        public string Bids => bid ?? bidDeltas;
    }

Код:
OrderBookExample1 obe = new() { bid = "bid", bidDeltas = "bidDeltas" };
string s = obe.Bids;//"bid"

s = "bid" потому что первым объявлено в классе или зависит от компилятора? Хотя код работает т.к. если bid = null, Bids = "bidDeltas", но непонятно это соответствует какой-то спецификации или такая случайная реализация.
Re[7]: Можно ли сделать один класс?
От: Farsight СССР  
Дата: 27.01.21 12:52
Оценка: 2 (1)
Здравствуйте, Passerby, Вы писали:

P>Код:

P>
P>OrderBookExample1 obe = new() { bid = "bid", bidDeltas = "bidDeltas" };
P>string s = obe.Bids;//"bid"
P>

P>s = "bid" потому что первым объявлено в классе или зависит от компилятора? Хотя код работает т.к. если bid = null, Bids = "bidDeltas", но непонятно это соответствует какой-то спецификации или такая случайная реализация.

про ?? почитайте и все понятно станет.
</farsight>
Re[2]: Можно ли сделать один класс?
От: Passerby  
Дата: 27.01.21 12:52
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Какими атрибутами? Что мешает просто использовать один класс? Какой именно сериализатор имеется в виду?

А как сделать один класс если в строке которая десериализуется в одном случае "bid" в другом "bidDeltas". Какой класс для десериализации?
Newtonsoft.Json
Отредактировано 04.02.2021 23:35 VladD2 . Предыдущая версия . Еще …
Отредактировано 27.01.2021 12:56 Passerby . Предыдущая версия .
Re[8]: Можно ли сделать один класс?
От: Passerby  
Дата: 27.01.21 12:55
Оценка:
Здравствуйте, Farsight, Вы писали:

F>про ?? почитайте и все понятно станет.

А, ну да...
Отредактировано 04.02.2021 23:36 VladD2 . Предыдущая версия .
Re[3]: Можно ли сделать один класс?
От: Ночной Смотрящий Россия  
Дата: 27.01.21 13:23
Оценка: 3 (2)
Здравствуйте, Passerby, Вы писали:

P>А как сделать один класс если в строке которая десериализуется в одном случае "bid" в другом "bidDeltas". Какой класс для десериализации?


Синонимы для одного поля? Нет, в Json.Net такого из коробки нет. Можно сделать самому через кастомный конвертер. Но в данном случае семантика этих полей все таки разная, не смотря на формальное совпадение типа, так что я оставил бы два разных класса.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re: Можно ли сделать один класс?
От: IT Россия linq2db.com
Дата: 27.01.21 14:28
Оценка: 4 (2)
Здравствуйте, Passerby, Вы писали:

P>в дальнейшем код работы с классами одинаков. Можно ли как-то атрибутами сделать один класс?


Можно интерфейсом.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Можно ли сделать один класс?
От: Ночной Смотрящий Россия  
Дата: 27.01.21 15:07
Оценка: 1 (1)
Здравствуйте, IT, Вы писали:

IT>Можно интерфейсом.


Можно. Но такая городушка еще сложнее двух разных классов.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re: Можно ли сделать один класс?
От: L_G Россия  
Дата: 27.01.21 16:05
Оценка: 2 (1)
public class OrderBookExample
    {
        public List<BidDelta> bid { get; set; }
        public List<BidDelta> bidDeltas { get { return bid; } set { bid = value; } }
    }

или, на всякий случай:
public class OrderBookExample
    {
        private List<BidDelta> _bid;
        public List<BidDelta> bid { get { return _bid; } set { _bid = value; } }
        public List<BidDelta> bidDeltas { get { return _bid; } set { _bid = value; } }
    }
Каша в голове — пища для ума (с)
Отредактировано 27.01.2021 16:08 L_G . Предыдущая версия .
Re: Можно ли сделать один класс?
От: Doc Россия http://andrey.moveax.ru
Дата: 28.01.21 02:10
Оценка: +6
Здравствуйте, Passerby, Вы писали:

P>в дальнейшем код работы с классами одинаков. Можно ли как-то атрибутами сделать один класс?


Я бы оставил их как контракты, а для BL ввел свою модель (куда и копировал бы данные из контрактов после получения).
В результате, BL бы не зависила от того, что придет в голову авторам API откуда берутся данные.
Re: Можно ли сделать один класс?
От: varenikAA  
Дата: 28.01.21 04:04
Оценка:
Здравствуйте, Passerby, Вы писали:

P>С сервера в json приходят данные, которые в зависимости от метода запроса после десериализации записываются в:

в зависимости от метода запроса

☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Можно ли сделать один класс?
От: mDmitriy Россия  
Дата: 28.01.21 04:46
Оценка: 2 (1)
Здравствуйте, Passerby, Вы писали:

для json можно так:
 public class OrderBook
    {
        [DataMember]
        private List<BidDelta> bid;
        [DataMember] 
        private List<AskDelta> ask;
        [DataMember]
        private List<BidDelta> bidDeltas;
        [DataMember] 
        private List<AskDelta> askDeltas;

        public List<BidDelta> BidList => bid ?? bidDeltas;
        public List<AskDelta> AskList => ask ?? askDeltas;
        [DataMember]
        public int sequence { get; set; }
    }
Re[2]: Можно ли сделать один класс?
От: Passerby  
Дата: 28.01.21 06:44
Оценка:
Всем спасибо. Что-то взбрело простейшее решение: заменить во входящей строке bidDeltas на bid или даже просто убрать "Deltas".
Re[2]: Можно ли сделать один класс?
От: Passerby  
Дата: 28.01.21 06:52
Оценка:
Здравствуйте, varenikAA, Вы писали:

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


P>>С сервера в json приходят данные, которые в зависимости от метода запроса после десериализации записываются в:

AA>

AA>в зависимости от метода запроса

Не понял, что не так? Формат данных зависит от того, каким образом происходит запрос с сервера: либо обработка подписанного потока по вебсокету, либо запрос через HttpClient.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.