在设计时将属性使用限制为互斥?

时间:2011-11-10 15:00:38

标签: c# attributes

我正在开发一个序列化类,它使用自定义类的属性来修饰属性是固定长度格式还是分隔格式。这两个属性应该是互斥的,这意味着开发人员可以在属性上指定[FixedLength][Delimited](使用适当的构造函数),但不能同时指定两者。为了降低复杂性并提高清洁度,我想要组合属性并根据格式类型设置标记,例如[Formatted(Formatter=Formatting.Delimited)]。是否可以在设计时将这些属性限制为彼此互斥?我知道如何在运行时检查这个场景。

1 个答案:

答案 0 :(得分:3)

你不能在.NET中这样做。最多可以允许类的相同属性的单个实例,如下例所示:

using System;

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
class BaseAttribute : Attribute {
}

[Base]
[Base] // compiler error here
class DoubleBase { 
}

但是这种行为不能扩展到派生类,即如果你这样做,它会编译:

using System;

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
class BaseAttribute : Attribute {
}

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
class Derived1Attribute : BaseAttribute {
}

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
class Derived2Attribute : BaseAttribute {
}

[Derived1]
[Derived2] // this one is ok
class DoubleDerived {
}

我能想到的最好的是你可以写一些东西来检查是否没有应用这两个属性的类型,并使用check作为构建后的步骤。