Как отмечалось в предыдущих постерах, типы, используемые в аргументах атрибутов, довольно строго ограничены (понятно, потому что их значения необходимо сериализовать непосредственно в блок метаданных сборки).
Тем не менее, вы, вероятно, можете создать решение, которое использует typeofs , так как эти могут использоваться.
Например:
[PropertyValidation(typeof(NullOrEmptyValidatorScheme))]
public string Name { get; private set; }
Этот синтаксис совершенно легален. Код, который читает ваши атрибуты, должен получить тип валидатора, создать новый экземпляр валидатора (он может даже поддерживать кеш валидаторов, привязанный к типам валидатора, если это уместно - это довольно распространенный метод), а затем вызвать его .