Классы друзей работают только для аннотаций данных? - PullRequest
1 голос
/ 10 июня 2010

Классы собеседников работают только для аннотаций данных или для каких-либо атрибутов? Я пытался прикрепить ColumnAttribute к полю в моем классе собеседников, но похоже, что он не обрабатывается в исходном классе. Два класса связаны через MetadataType.

Ответы [ 2 ]

0 голосов
/ 15 октября 2010

Техника класса приятелей не является чем-то особенным для DataAnnotations. Однако это работает только в том случае, если используемый вами код отражения делает что-то с атрибутом MetadataType. Итак, ASP.NET MVC является примером кодовой базы, которая обрабатывает концепцию класса друзей, а Linq-to-sql - нет. Итак, в данный момент вы застряли, если хотите использовать классы друзей для добавления ColumnAttribute. Однако, если вам действительно нужно стать фантазером, Linq-to-SQL возьмет XML-документ с сопоставлениями вместо использования атрибутов. Вы можете использовать это для построения ваших отображений в качестве альтернативы для случаев, когда вы могли использовать класс друзей.

Если вам нужно по-настоящему, по-настоящему придумать, сделайте свой класс приятелей, а затем напишите свой собственный обработчик отражения с учетом классов собеседников для ваших украшенных атрибутов классов Linq и создайте из них документы сопоставления XML для ваших нужд DataContext. Вы могли бы сделать это менее чем за 50 строк кода.

0 голосов
/ 13 августа 2010

Мой ответ не является специфичным для DataAnnotations, это глобальный ответ о том, как связывать дескрипторы типов.

Создайте подкласс TypeDescriptionProvider, который описывает отношение классов (может пропустить эту часть в некоторых случаях, когда вы можете использовать существующий дескриптор, такой как AssociatedMetadataTypeTypeDescriptionProvider).

Затем используйте TypeDescriptor.AddProvider или TypeDescriptor.AddProviderTransparent для динамического присоединения их во время выполнения.

Я предлагаю иметь службу, которая имеет список помеченных типов, и запускать все типы через нее (по требованию, поэтому затраты на производительность распределяются в приложениивремя выполнения), и когда тип обрабатывается, добавьте тип в список, и в следующий раз, когда этот тип запросит, вы узнаете, что он находится в списке.

...