Вот немного отличающийся подход, если Вы так не интересуетесь программированием его, но более интересующиеся результатами: считайте здание им с помощью API Google Custom Search Engine .
Преимущества:
Недостатки:
Значения атрибутов ограничены простыми типами; например, базовые константы (включая строки) и typeof
... вы не можете использовать new
или другой более сложный код. Коротко; ты не можешь этого сделать. Вы можете присвоить ему тип :
[PropertyValidation(typeof(NullOrEmptyValidatorScheme)]
т.е. ctor PropertyValidation
принимает тип
и использовать Activator.CreateInstance
внутри код для создания объекта. Обратите внимание, что в идеале вы должны просто сохранить строку внутри ( AssemblyQualifiedName
).
Из ECMA 334v4:
§24.1.3 Типы параметров атрибутов
Типы позиционных и именованных параметры для класса атрибута ограничен параметром атрибута типы , а именно:
- Один из следующих типов:
bool
,byte
,char
,double
,float
,int
,long
,short
,string
.- ] Тип
, объект
.- Тип
System.Type
.- Тип перечисления, если он имеет общедоступный доступ и типы, в которые он вложен (если есть) также общедоступны.
- Одномерные массивы указанных выше типы.
и
§24.2 Спецификация атрибутов
...
Выражение
E
является атрибут-аргумент-выражение, если все из следующих утверждений верны:
- Тип
E
является атрибутом тип параметра (§24.1.3).- Во время компиляции значение E может быть разрешено одним из следующих:
- Постоянное значение.
- Тип-выражение (§14.5.11), определяющее неуниверсальное тип, замкнутый сконструированный тип (§25.5.2) или несвязанный универсальный тип (§25.5).
- Одномерный массив атрибут-аргумент-выражения.
Как и в предыдущих плакатах было отмечено, что типы, используемые в аргументах атрибутов, весьма строго ограничены (это понятно, поскольку их значения должны быть сериализованы непосредственно в большой двоичный объект метаданных сборки).
Тем не менее, вы, вероятно, можете создать решение, использующее typeofs ], так как можно использовать .
Например:
[PropertyValidation(typeof(NullOrEmptyValidatorScheme))]
public string Name { get; private set; }
Этот синтаксис совершенно допустим. Код, который считывает ваши атрибуты, вы должны получить тип валидатора, создать новый экземпляр валидатора (он даже может поддерживать кеш валидаторов с ключами для типов валикатора,