![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| mr.Anderson |
|
||||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 1 Всего: 128 |
Задача такого плана. Есть XML-файлик, где расписаны значения некоторых свойств, которые имеются в классе. Класс в своем конструкторе должен эти значения прочитать и растолкать по свойствам, ориентируясь на имя нода (оно совпадает с именем свойства). Сейчас этим очень топорно занимается этот код:
Вообще, а если свойств 100? Все вручную писать? Нехорошо. Тогда нужно получить список свойств, получить список нодов и спокойно распихать значения. Но возникла проблема, а как преобразовать считываемую строку к нужному типу? Если допустить, что типы могут быть разные, будь то целые, дробные, строки, логические и т.п. Необходимый тип можно узнать по типу свойства, которому присваиваем. Осталась одна задача: привести считанную строку к нужному типу. Но как? Получить тип данного свойства, найти у него метод Parse, попытаться использовать? Ну я так и попробовал. Но не смог понять, как правильно вызвать его. Мб и другой метод есть? Сейчас теоретический недописанный вариант такой:
И вообще, в том ли направлении я думаю? Может, попроще есть способ? |
||||
|
|||||
| KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 11 Всего: 38 |
Так вроде:
-------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 1 Всего: 128 |
KelTron, да, все верно. Спасибо.
Если у кого еще возникнет такая проблема, вот код чтения значений свойств с XML-файла и расталкивания их по свойствам в классе (при условии одноуровневой глубины структуры XML-файла и совпадении названия нода с названием свойства):
|
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
mr.Anderson, а почему не через стандартный XmlSerializer?
|
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 1 Всего: 128 |
PashaPash, я с ним вообще не сталкивался, хотя по названию уже понятно примерно, что он делает. Просто не работал, это решение кажется более простым и очевидным.
|
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
mr.Anderson,
Последняя строчка - аналог LoadInfo(string xmlDataFile). |
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 1 Всего: 128 |
Хм. Спасибо) Но как дело будет обстоять с тем, что мне не нужно инициализировать все свойства? Свойств много, и вовсе не все из них инициализируются из XML. Сериализация/десериализация как-то повлияет на поля, которые не должны быть затронуты? Или просто пометить их все как [NonSerialized] и она не будет их трогать? В таком случае методы нужно тоже запрещать сериализовать?
|
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
mr.Anderson, методы не сериализуются. Поля можно убирать из сериализации используя XmlIgnoreAttribute. Ну и в целом там довольно гибкий механизм.
|
|||
|
||||
| mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 1 Всего: 128 |
PashaPash, все оно здорово, только как мне загрузить свойства внутри самого класса? Т.е. вот у меня есть (как в моем примере) класс, он при работе собственного конструктора грузит свои свойства. Если использовать мою функцию, то все нормально. А если десериализацию, то куда присваивать результат десериализации? В this, понятное дело, не присвоишь. Как быть?
|
|||
|
||||
| PashaPash |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
mr.Anderson, вот в этом случае - никак. :( Просто обычно десериализация подразумевает создание нового объекта. Скорее всего сейчас создание Fish выглядит как:
сделать статический метод вместо конструктора, будет выглядеть как
в методе десериализовать новый объект, и возвращать его. |
||||
|
|||||
| mr.Anderson |
|
||||||||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: 1 Всего: 128 |
А есть ли способ метод загрузки данных свойств вынести в отдельный статический класс? Ведь внутри каждого класса этот метод будет повторяться и иметь одну и ту же реализацию... Это ведь не очень хорошо, допустим, у меня четыре класса должны загружать свои свойства, что, в каждом из них это прописывать? Впрочем, тут хоть с моим вариантом, хоть с вашим, все равно проблемы получаются.
Кстати, у меня тут получилось реализовать шикарную штуку) Я сделал так, что если XML-файлик имеет структуру, описанную выше, (которой каждый нод имеет то же имя, что и соответствующее свойство в нужном классе, а содержимое нода - предполагаемое значение этого свойства), то можно теперь использовать статический класс, который для любого объекта любого типа, наследуемого от простенького интерфейса, может загрузить данные из ассоциированного с этим классом XML-файла и может автоматически растолкать все значения по нужным свойствам. Думаю, очень удобно) Привожу решение для тех, кому это может пригодиться. Интерфейс:
Пример класса, который может загружать свои свойства:
Реализация статического загрузчика:
Содержимое XML-файла для этого случая:
Имхо, очень удобно) Можно теперь прописывать классы, свойства которых можно исправлять без перекомпиляции. Универсально для любых проектов. Это сообщение отредактировал(а) mr.Anderson - 8.4.2010, 20:24 |
||||||||
|
|||||||||
| PashaPash |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
Не обязательно повторять метод в каждом классе. Вообще сам метод нужен только для: - передачи типа в XmlSerializer - приведения типа при возврате объекта. XmlSerializer появился до 2-го дотнета и до генериков. Сейчас достаточно написать обертку типа:
И загружать хоть рыбу, хоть карты:
|
||||
|
|||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | .NET для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |