Разрешить конструктор атрибутов, зависящий от AttributeUsage - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть атрибут, который можно применить к классу или свойству.Этот класс имеет два конструктора.Один принимает тип, другой принимает тип и строку.

 [AttributeUsage(
        AttributeTargets.Property | 
        AttributeTargets.Class, 
        AllowMultiple = true)]    
class DcProxyAttribute : Attribute{
     public DcProxyAttribute(Type type){ /*...*/ }
     public DcProxyAttribute(Type type, string str){ /*...*/ }
}

Я могу использовать его как

   [DcProxy(typeof(SomeType)]
   class MyClass {
       [DcProxy(typeof(SomeType, "Hello World")] 
       public string SomeProperty { get; set;}
   }

Я хочу ограничить его этим использованием.Имеет смысл использовать его таким образом.

Следующие использования теперь считаются действительными, но они не должны.

   [DcProxy(typeof(SomeType, "Hello world")]
   class MyClass {
       [DcProxy(typeof(SomeType)] 
       public string SomeProperty { get; set;}
   }

Можно ли это сделать?

Iмог бы создать два отдельных класса для него.A DcProxyForClass и A DcProxyForProperty.И используйте его как

  [DcProxyForClass(typeof(SomeType)]
  class MyClass {
       [DcProxyForProperty(typeof(SomeType, "Hello World")] 
       public string SomeProperty { get; set;}
  }

, но этот вид кода делает его менее читабельным, так как с семантической точки зрения они делают то же самое.

1 Ответ

0 голосов
/ 07 февраля 2019

Нет, вы не можете сделать это в принципе.

Опции:

  1. живут с ним и вызывают исключение во время выполнения, если используется неправильная перегрузка
  2. имеет два отдельных атрибута, по одному для каждого (как вы уже предлагаете) - возможно, с использованием общего атрибута базового типа
  3. жить с ним, но написать анализатор кода (Roslyn и т. Д.), Который обнаруживает сценарий и флагиэто в IDE / build (предположительно в сочетании с "1")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...