Получить тип класса в классе атрибута

1

Я хочу проверить условие определения класса в процессе сборки и показать ошибку сборки в случае, если что-то не проверено.

В процессе сборки атрибут атрибута создается для каждого класса, определенного этим атрибутом. Я хочу проверить что-то вроде, например, что класс не имеет более 4 свойств (например, это не мое намерение). Как я могу получить тип из конструктора атрибутов для каждого класса? (Без передачи в качестве параметра).

Пример:

    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
    public class ValidatePropertiesAttribute:ValidationAttribute
    {
         public ValidatePropertiesAttribute()
         {
             if(Validate()==false)
             {
                 throw new Exception("It not valid!! add more properties to the type 'x'.");
             }
         }

         public bool Validate()
         {
             //check if there are at least 4 properties in class "X"  
             //Q: How can I get class "X"?
         }         
    }

    [ValidateProperties()]
    public class ExampleClass
    {
        public string OnOneProperty { get; set; }
    }

Возможно ли это?

Если нет, есть ли другой способ сделать это? (добавьте валидацию в процесс сборки и покажите ошибки в случае, если что-то не было проверено)

  • 0
    Кто-нибудь знает, что может быть решением?
  • 0
    Это невозможно. Есть сильный намек на то, что вы недостаточно задумывались о том, как вы собираетесь это реализовать. Когда вы это сделаете, вы обнаружите, что передача типа в метод Validate () в качестве аргумента является тривиальным решением.
Теги:
reflection
attributes
msbuild

1 ответ

1

Это решение может работать

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class ValidatePropertiesAttribute:ValidationAttribute
{
     private Type TargetClass;
     public ValidatePropertiesAttribute(Type targetClass)
     {
         TargetClass = targetClass;
         if(Validate() == false)
         {
             throw new Exception("It not valid!! add more properties to the type 'x'.");
         }
     }

     public bool Validate()
     {
         //Use Target Class, 
         //if you need extract properties use TargetClass.GetProperties()...
         //if you need create instance use Activator..
     }         
}

Используйте этот атрибут следующим образом

[ValidateProperties(typeof(ExampleClass))]
public class ExampleClass
{
    public string OnOneProperty { get; set; }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню