2014-08-31 66 views
0

意向:自定义属性构造函数何时执行?

我写一个使用大部分这些枚举存在于数据库中的表太多次枚举业务应用。问题出现在维护时,其中一个团队成员或后期开发人员在两个地方之一更改枚举成员值,使枚举未被同步。为了解决这个问题,我试图创建一个自定义枚举属性,当它发现一个枚举值不同步时抛出一些异常。

实现:

[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 
} 

问题:

问题是这样的属性构造从不执行!我试过用类替换枚举,发现它执行得很好,但是使用枚举,不行!

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

+0

的可能重复的[属性类不调用构造函数(http://stackoverflow.com/questions/2470164/attribute-class-not-calling-constructor) – 2014-08-31 09:31:50

+0

在我发布帖子之前,我通过这个帖子来了,但不幸的是它无法解决我的问题。 – Sisyphus 2014-08-31 09:35:53

+0

遵循其他答案时不起作用? – 2014-08-31 09:36:43

回答

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. 
    } 
} 
+0

这是导致Attribute构造函数触发的唯一方法吗?当类实例化时,如何自动触发类属性? – Sisyphus 2014-08-31 10:08:07

+2

是的,这是唯一的方法。不,他们也不会开火。 – 2014-08-31 10:32:36

+1

因为它们是属性。除非有人决定解雇他们,否则他们只是数据。 – 2014-08-31 11:21:46

相关问题