【问题标题】:When does custom attribute constructor executes?自定义属性构造函数何时执行?
【发布时间】:2014-08-31 09:26:30
【问题描述】:

意图:

我正在编写一个使用多个枚举的业务应用程序,其中大多数枚举也存在于数据库的表中。当团队成员之一或后期开发人员在两个位置之一更改枚举成员值而导致枚举不同步时,问题就出现在维护中。为了解决这个问题,我尝试创建一个自定义枚举属性,当它发现枚举值不同步时会引发一些异常。

实施:

[AttributeUsage(AttributeTargets.Enum)]
public class EnumSyncAtrribute : Attribute
{

    public EnumSyncAtrribute(Type databaseAccessType, Type enumType))
    {

        // Code that uses that databaseAccessType to access the database to get
        // enum values then compare it to values of enumType , goes here.

    }
}

然后目标枚举标记如下

[EnumSyncAtrribute(typeof(MyDataBaseAccess), typeof(MyEnum))]
public enum MyEnum
{
    value1 = 0,
    value2 = 1,
    value3 = 2
}

问题:

问题是这个属性构造函数永远不会执行!我试过用 Classes 替换 Enums,发现它执行得很好,但是用 Enums,不行!

问题是,当自定义属性用于枚举时,它们的构造函数什么时候执行?

【问题讨论】:

  • 我在发帖之前就来到了这个帖子,但不幸的是它无法解决我的问题。
  • 跟随其他答案时什么不起作用?
  • 对不起,我不明白你的意思。
  • 那篇帖子为什么没有解决您的问题?

标签: c# custom-attribute


【解决方案1】:

该属性仅在您检索它时才被构造(使用GetCustomAttribute 函数)。否则,其构造配方(构造函数重载 + 位置参数 + 属性值)仅存储在程序集元数据中。

在您的情况下,我将从程序集中检索所有枚举类型,并检查它们是否具有该属性。在你的应用程序启动时这样的事情:

var allEnumTypes = Assembly.GetExecutingAssembly()
                           .GetTypes()
                           .Where(t => t.IsEnum);

foreach(var enumType in allEnumTypes)
{
    var syncAttr = Attribute.GetCustomAttribute(enumType, typeof(EnumSyncAtrribute)) as EnumSyncAtrribute;
    if (syncAttr != null)
    {
        // Possibly do something here, but the constructor was already executed at this point.
    }
}

【讨论】:

  • 这是导致 Attribute 构造函数触发的唯一方法吗?类实例化时类属性如何自动触发?
  • 是的,这是唯一的方法。不,它们也不会开火。
  • 因为它们是属性。除非有人决定启动它们,否则它们只是数据。
  • @user2080257 只是补充一点:我宁愿将您的验证码从属性构造函数移动到启动代码。这样,如果其他代码处理反射,验证就不会被意外触发多次。属性应该限制自己的数据存储。
  • @user2080257 我在答案中发布的代码,我猜你想在启动时运行它
猜你喜欢
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多