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