Атрибуты, которые реализуют другие атрибуты - PullRequest
0 голосов
/ 06 мая 2019

Я хочу, чтобы фасад или прокси реализовал атрибут библиотеки.например атрибуты отображения свойств.

Я хочу контролировать, какой из атрибутов библиотек будет использоваться в проекте.какой-то DI или модуль управления.Есть ли простой способ достичь этого без использования отражения?

что-то, чтобы перевести эти два типа атрибутов в один:

[MapsFromAndToProperty(typeof(fooClass), nameof(fooClass.PropertyName))]

и

[AdaptMember(name)]

в

[MyAttributeToControlWhichOneToUse(typeof(fooClass), nameof(fooClass.PropertyName))]

И спасибо за внимание.Любая помощь будет оценена.

1 Ответ

1 голос
/ 08 мая 2019

Как отмечено в комментариях, невозможно изменить атрибуты в общем случае. Это просто потому, что атрибуты фактически являются частью метаданных сборки, и выполнение того, что вы хотите, означает изменение метаданных сборки.

Существует два способа, как это потенциально может работать:

  1. Вы меняете метаданные сборки. Здесь вы находитесь в сфере аспектно-ориентированного программирования. Вы можете попытаться создать аспект, например, на основе PostSharp, который развертывает ваш атрибут MyAttributeToControlWhichOneToUse в необходимые атрибуты во время компиляции. Это решение не зависит от способа чтения атрибутов, но требует изменений в инфраструктуре сборки.
  2. Вы изменяете способ загрузки атрибутов. MEF является примером, который делает это для своей модели программирования, основанной на соглашениях, которая эффективно эмулирует атрибуты в обычных классах, изменяя способ получения атрибутов. Это работает, только если это предусмотрено в библиотеке, которая читает свойства (и, честно говоря, я никогда не видел, чтобы кто-нибудь еще, кроме MEF, делал это).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...