意图:
我正在编写一个使用多个枚举的业务应用程序,其中大多数这些枚举也存在于数据库的表中。当其中一个团队成员或后期开发人员在两个地点中的一个地点更改枚举成员值而使枚举未同步时,问题就出现在维护中。为了解决这个问题,我试图创建一个自定义枚举属性,当它发现枚举值不同步时抛出一些异常。
实施:
[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
}
问题:
问题是这个属性构造函数永远不会执行!我已经尝试用类替换枚举,发现它执行正常,但是使用Enums,没有!
问题是,当自定义属性用于枚举时,它们的构造函数何时执行?
答案 0 :(得分: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.
}
}