XMLSerialize CategoryAttribute для нескольких свойств - PullRequest
1 голос
/ 18 ноября 2011

C # .net 2008

Я работаю над файлом классов с несколькими сотнями свойств в примерно 8 сериализованных категориях.На данный момент это будет выглядеть так:

[CategoryAttribute("Group1")]
public string property
[CategoryAttribute("Group1")]
public string property
[CategoryAttribute("Group1")]
public string property
[CategoryAttribute("Group1")]
public string property

[CategoryAttribute("Group2")]
public string property
[CategoryAttribute("Group2")]
public string property
[CategoryAttribute("Group2")]
public string property
[CategoryAttribute("Group2")]
public string property

Я проводил исследования в прошлые времена и не нашел никаких путей к решению, поэтому на этот раз я спрашиваю, есть ли у кого-нибудь решение, чтобы получитьчто-то менее грязное?Такие как:

[CategoryAttribute("Group1")]
{
public string property;
public string property;
public string property;
public string property;
public string property;
public string property;
public string property;
}
[CategoryAttribute("Group2")]
{
public string property;
public string property;
public string property;
public string property;
public string property;
public string property;
public string property;
}

Ответы [ 3 ]

3 голосов
/ 08 декабря 2011

Хотя все остальные ответы полностью верны, я мог бы предложить вам другую идею.

Вы можете попробовать использовать шаблоны T4 для создания такого файла.Пожалуйста, смотрите мой пример на GitHub

По сути, я создал шаблон /EntitiesWithALotOfProperties/FirstClass.generated.tt, который читает файл с тем же именем, но с замененным ". Generate.tt" в ". template.cs" и обрабатывает последний в соответствии с вашей логикой.

Что важно отметить: FirstClass.template.cs должен был установить действие сборки на ' Нет».Идея заключалась в следующем: * .cs файлы могут быть легко отредактированы с помощью ReSharper (в основном это IntelliSense), но в то же время он не объявляет дублирующиеся элементы.

Вот несколько скриншотов: Another partial part Template file Generated file

2 голосов
/ 19 ноября 2011

Нет.Атрибуты не предназначены для прикрепления к таким группам предметов.Если у вас действительно есть сотни свойств в каждом классе, вы можете подумать о реорганизации ваших классов.Может ли каждая группа быть классом?Являются ли эти сложные бизнес-объекты или категории могут стать словарными объектами со свойствами, содержащимися в них?Просто некоторые идеи.

0 голосов
/ 19 ноября 2011

Возможно, вы захотите написать собственный дескриптор типа, который предоставляет ICustomAttributeProvider для его различных членов. Хотя это не так сложно реализовать, я обнаружил, что обнаружение дескриптора типа в .NET немного сломано. Большинство фреймворковых функций распознают их, но другие этого не делают, а просто используют GetType (). GetProperty () (например, WCF DataServiceContext).

Я предлагаю вам придерживаться вашего текущего подхода, но я бы где-то сделал имя категории константным (значения-атрибуты должны быть константами), чтобы вы могли изменить его в одном месте. Если вам нужна помощь в реализации дескриптора типа, дайте мне знать, и я уверен, что смогу привести пример. Взгляните на классы TypeDescriptor, TypeDescriptorProvider и PropertyDescriptor в MSDN, вы должны быть очень осторожны, особенно с таким огромным классом (и обычно у вас есть больше, чем просто атрибут CategoryAttribute для свойств, который требует смешивания встроенного дескриптора типа и ваш заказ).

...