Работают ли Buddy Classes только для DataAnnotations?

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


person Alex    schedule 09.06.2010    source источник


Ответы (2)


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

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

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

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

person Shimmy Weitzhandler    schedule 13.08.2010

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

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

person mattmc3    schedule 15.10.2010