C# 在设计时将属性使用限制为相互排斥?

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

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

您不能在.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 {
}

我能想到的最好的办法是,您可以编写一些东西来检查是否没有同时应用了这两个属性的类型,并将检查用作生成后的步骤。

+1:我也会对这个答案感兴趣@乔治:我很久没有使用它了,但是FileHelpers库()可能做了一些与您尝试做的非常相似的事情。。。你可以看看他们是如何解决这个问题的。。。