【问题标题】:Custom Attribute not firing on break point自定义属性未在断点触发
【发布时间】:2020-12-21 09:06:59
【问题描述】:

我为对象验证创建了一个自定义属性,并在TaskValidatorAttribute 类的任何位置设置了一个断点,它似乎没有执行或触发任何操作。请参阅下面的代码:

自定义属性

[AttributeUsage(AttributeTargets.Class)]
public TaskValidatorAttribute: Attribute
{
   public TaskValidatorAttribute(Type type)
   {
      if (type.IsSubclassOf(typeof(BaseClass))) 
      {
          // some code for validation
      }
   }
}

基类

public abstract class BaseClass {}

继承类

[TaskValidator(typeof(ModelTest))]
public class ModelTest : BaseClass {}

单元测试

public class ModelValidationTests
{
   [Fact]
   public void ValidateModel()
   {
      var model = new ModelTest();
      model.ShouldNotBeNull();
   }
}

我尝试在我的单元测试中运行它以触发我制作的自定义属性,但没有运气。我错过了什么吗?

【问题讨论】:

  • 您是否尝试创建自定义验证属性?这可能会从public TaskValidatorAttribute: Attribute 更改为public TaskValidatorAttribute: ValidationAttribute
  • 嗨@tontonsevilla,的确,我创建了自己的自定义验证...
  • 嗨@tontonsevilla,似乎使用ValidationAttribute 不会触发,hmp.. 不太清楚为什么它不起作用。

标签: c# custom-attributes


【解决方案1】:

当您创建ModelTest 类的实例时,这并不意味着创建了应用于该类的属性的实例。仅当您显式获取属性时才会实例化这些属性。事实上,您甚至不需要 ModelTest 类的实例!

所以这里的关键是属性不是对象的一部分,它是一个具有不同目的和生命周期的装饰器。

试试这个:

public class ModelValidationTests
{
   [Fact]
   public void ValidateModel()
   {
      object[] attributes = typeof(ModelTest).GetCustomAttributes(true);
      attributes.ShouldNotBeNull();
   }
}

【讨论】:

  • 您好,感谢您的回答,但我已经使用GetCustomAttributes 触发它,但我不太确定它为什么首先需要它?有没有其他方法可以在不调用GetCustomAttributes的情况下解决问题?
猜你喜欢
  • 1970-01-01
  • 2021-12-06
  • 2019-03-13
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 2013-06-02
  • 2021-09-10
  • 2021-06-03
相关资源
最近更新 更多