Re[6]: Динамическое приведение типов
От: mitechka  
Дата: 17.08.15 13:23
Оценка:
Здравствуйте, Serginio1, Вы писали:

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




M>>Ммм... Хорошо, тогда вопрос — если потомков 2, каждый из них — дженерик, то как определить и привести полученное сообщение именно к нужному потомку? Собственно, основной проблемой для меня было именно это...

S> Так попробуй NetDataContractSerializer. Главное, что бы сборки классов были на клиенте и на сервере или в гаке
S>Он сам десериализует в нужный объект.

Так, что-то уже я ничего не понимаю... Deserialize метод у NetDataContractSerializer принимает поток, возвращает объект типа object. Который потом уже нужно кастить самостоятельно в нужный тип, разве не так? А вот оный как раз и неизвестен заранее, есть лишь переменная типа Type, которая его хранит.
Если есть пример — приведите, я буду только рад, ручки целовать буду, если покажете, т.к. для меня это достаточно актуально сейчас...
Re[7]: Динамическое приведение типов
От: scale_tone Норвегия https://scale-tone.github.io/
Дата: 17.08.15 13:51
Оценка:
Здравствуйте, mitechka, Вы писали:


M>Так, что-то уже я ничего не понимаю... Deserialize метод у NetDataContractSerializer принимает поток, возвращает объект типа object. Который потом уже нужно кастить самостоятельно в нужный тип, разве не так? А вот оный как раз и неизвестен заранее, есть лишь переменная типа Type, которая его хранит.


По-прежнему не можем понять, зачем нужны переменные типа Type и зачем чего-то куда-то кастить. Если есть экземпляр какого-то объекта, его тип узнают методом myObject.GetType(), для этого не нужны доп. поля. И даже этот метод вызывать не нужно, потому что:

foreach (object msg in GetMyMessagesAsObjectsFromDataContractSerializer()) // object, Карл!
{
    ProcessMessage((dynamic)msg);
}
Re[7]: Динамическое приведение типов
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 17.08.15 14:08
Оценка: +1
Здравствуйте, mitechka, Вы писали:

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


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




M>>>Ммм... Хорошо, тогда вопрос — если потомков 2, каждый из них — дженерик, то как определить и привести полученное сообщение именно к нужному потомку? Собственно, основной проблемой для меня было именно это...

S>> Так попробуй NetDataContractSerializer. Главное, что бы сборки классов были на клиенте и на сервере или в гаке
S>>Он сам десериализует в нужный объект.

M>Так, что-то уже я ничего не понимаю... Deserialize метод у NetDataContractSerializer принимает поток, возвращает объект типа object. Который потом уже нужно кастить самостоятельно в нужный тип, разве не так? А вот оный как раз и неизвестен заранее, есть лишь переменная типа Type, которая его хранит.

M>Если есть пример — приведите, я буду только рад, ручки целовать буду, если покажете, т.к. для меня это достаточно актуально сейчас...
Зачем тебе переменная Type?
Тип объекта ты получаешь через объект.GetType()
А получив тип уже можешь делать, что угодно. Можешь привести к интерфейсу, можешь создать хэш таблицу по типу и делегату, динамики итд. Вариантов куча.
Это уже проблема не десериализации , а контрактов для выполнения методов.
и солнце б утром не вставало, когда бы не было меня
Отредактировано 17.08.2015 14:20 Serginio1 . Предыдущая версия .
Re[5]: Динамическое приведение типов
От: agat50  
Дата: 18.08.15 06:25
Оценка:
Здравствуйте, mitechka, Вы писали:

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


M>Мммм... А в библиотеке есть возможность привести динамически тип по переданному в переменной типу класса?


Как уже ниже отметили, это не проблема с сериализацией. В целом видимо от switch не убежать, или dynamic. Для вызова с generic'ами использовать MakeGenericMethod через reflection.
Re[8]: Динамическое приведение типов
От: mitechka  
Дата: 18.08.15 13:00
Оценка:
Здравствуйте, Serginio1, Вы писали:

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


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


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




M>>>>Ммм... Хорошо, тогда вопрос — если потомков 2, каждый из них — дженерик, то как определить и привести полученное сообщение именно к нужному потомку? Собственно, основной проблемой для меня было именно это...

S>>> Так попробуй NetDataContractSerializer. Главное, что бы сборки классов были на клиенте и на сервере или в гаке
S>>>Он сам десериализует в нужный объект.

M>>Так, что-то уже я ничего не понимаю... Deserialize метод у NetDataContractSerializer принимает поток, возвращает объект типа object. Который потом уже нужно кастить самостоятельно в нужный тип, разве не так? А вот оный как раз и неизвестен заранее, есть лишь переменная типа Type, которая его хранит.

M>>Если есть пример — приведите, я буду только рад, ручки целовать буду, если покажете, т.к. для меня это достаточно актуально сейчас...
S> Зачем тебе переменная Type?
S>Тип объекта ты получаешь через объект.GetType()
S>А получив тип уже можешь делать, что угодно. Можешь привести к интерфейсу, можешь создать хэш таблицу по типу и делегату, динамики итд. Вариантов куча.
S>Это уже проблема не десериализации , а контрактов для выполнения методов.

Тут скорее даже ошибка этапа проектирования. Думал, что получится сделать что-то "максимально общее". Ошибся.
Пока что решил, что будет некий базовый класс сообщения, в котором будет чисто uid, остальные классы будут от него наследоваться. И каждый класс будет реализовывать собственный интерфейс, отвечающий за тип данных, который в нём передаётся. Для значений общего вида это будет IDictionary<string, object> с дальнейшим приведением, например, через dynamic или рефлекшн.
Уже просто нет времени искать грааль, придётся ехать на велосипеде, что сам изобрёл.
Кстати, оффтоп — дайте хорошую книгу на русском по паттернам с примерами на C#. Буду благодарен.

Спасибо.
Re[9]: Динамическое приведение типов
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 18.08.15 13:40
Оценка:
Здравствуйте, mitechka, Вы писали:

M>Уже просто нет времени искать грааль, придётся ехать на велосипеде, что сам изобрёл.

M>Кстати, оффтоп — дайте хорошую книгу на русском по паттернам с примерами на C#. Буду благодарен.

M>Спасибо.

Да здесь проблема не в паттернах, а то, что ты хочешь получить от своей иерархии. И от этого уже плясать.
Создавть иерархия с перекрытием методов, Реализовывать шаблонные интерфейсы итд
http://habrahabr.ru/post/191934/
и солнце б утром не вставало, когда бы не было меня
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.