Работают ли классы друзей только для аннотаций данных или для любого атрибута? Я пытался прикрепить ColumnAttribute к полю в моем классе друзей, но оказалось, что он не обрабатывается в исходном классе. Два класса связаны через MetadataType.
Работают ли Buddy Classes только для DataAnnotations?
Ответы (2)
Мой ответ не специфичен для DataAnnotations, это глобальный ответ о том, как связать дескрипторы типов.
Создайте подкласс TypeDescriptionProvider
, описывающий отношение классы (вы можете пропустить эту часть в некоторых случаях, когда вы можете использовать существующий дескриптор, такой как AssociatedMetadataTypeTypeDescriptionProvider
).
Затем используйте TypeDescriptor.AddProvider
или TypeDescriptor.AddProviderTransparent
, чтобы динамически прикреплять их во время выполнения.
Мое предложение: иметь службу со списком помеченных типов и запускать через нее все типы (по требованию, поэтому стоимость производительности распределяется во время выполнения приложения), а когда тип обрабатывается, добавьте тип в list, и в следующий раз, когда этот тип запрашивает, вы знаете, что он есть в списке.
Техника класса приятелей не является чем-то особенным для DataAnnotations. Однако это работает только в том случае, если используемый вами код отражения что-то делает с атрибутом MetadataType
. Таким образом, ASP.NET MVC является примером кодовой базы, которая обрабатывает концепцию класса-приятеля, а Linq-to-sql — нет. Итак, на данный момент вы застряли, если хотите использовать классы друзей, чтобы добавить ColumnAttribute
. Однако, если вам действительно нужно проявить фантазию, Linq-to-SQL возьмет XML-документ с сопоставлениями вместо использования атрибутов. Вы можете использовать это для создания своих сопоставлений в качестве альтернативы экземплярам, где вы могли бы использовать класс друзей.
Если вам нужно что-то действительно причудливое, создайте свой класс-приятель, а затем напишите свой собственный обработчик отражения, учитывающий класс-приятель, против ваших классов, декорированных атрибутами Linq, и создавайте документы сопоставления XML из этого для ваших нужд DataContext. Вероятно, вы могли бы сделать это менее чем за 50 строк кода.