有没有办法可以选择强制.box_1
enum为"非Flags"特定用途?
例如,说我有
[Flags]
现在让我们说我有两个班级enum MyEnum {
X ,
Y ,
Z
}
和A
。 B类主要用于B
。 A类负责解析此列表,但仅在枚举与特定值匹配时才负责;
IEnumerable<B>
现在假设我希望A类能够使用多种类型的B.我可以将[Flags]属性添加到我的枚举中并执行以下操作:
class B {
MyEnum MyProperty { get; set; }
}
class A {
MyEnum Target = MyEnum.C;
void DoSomething(IEnumerable<B> list) {
for (var b in list) {
if (b.MyProperty == this.Target) {
// Do Some Work
}
}
}
}
然而,B类的[Flags]
enum MyEnum {
None = 0,
X = 1,
Y = 2,
Z = 4
}
class B {
MyEnum MyProperty { get; set; }
}
class A {
MyEnum Target = MyEnum.X | MyEnum.Z;
void DoSomething(IEnumerable<B> list) {
for (var b in list) {
if (this.Target.HasFlag(b.MyProperty)) {
// Do Some Work
}
}
}
}
现在可以用作旗帜,这是一个问题,因为在{{MyProperty
的上下文中没有MyEnum.X | MyEnum.Y
这样的东西。 1}}。这在B.MyProperty
中是有道理的,因为我的目标是各种B类。
我想出的工作是:
A
虽然这有效,但它确实很混乱。我现在必须跟踪两个不同的枚举。我在一个中做出的任何改变,我必须在另一个中进行,我必须确保值是同步的。最重要的是,我现在必须转发enum MyEnum {
None = 0,
X = 1,
Y = 2,
Z = 4
}
[Flags]
enum MyEnumTarget {
None = 0,
X = 1,
Y = 2,
Z = 4
}
class B {
MyEnum MyProperty { get; set; }
}
class A {
MyEnumTarget Target = MyEnumTarget.X | MyEnumTarget.Z;
void DoSomething(IEnumerable<B> list) {
for (var b in list) {
if (this.Target.HasFlag((MyEnumTarget)b.MyProperty)) {
// Do Some Work
}
}
}
}
才能将值传递给MyEnumTarget
。虽然我可以进行逐步操作,但其目的并不总是那么明显。无论哪种方式,我仍然需要两个&#34;匹配&#34;枚举。
有没有更好的方法呢?有没有办法使用单个枚举类型并在Enum.HasFlag
强制某种[NoFlags]属性。或者将两个枚举视为最佳方式/良好做法?
如果重要,我会使用C#6.0
答案 0 :(得分:1)
从根本上说,每个枚举类型都设计为有点掩码,或者不是。您可能会考虑的选项:
A.Property
一个List<MyEnum>
或类似的B.Property
setter验证只设置了一个位,否则抛出ArgumentException
答案 1 :(得分:0)
这两种用途有什么不同?听起来这些应该是两个不同的枚举因为它们的含义是不同的。他们使用的合同是不同的。如果这些是课程,我建议应用Interface Segregation Principle,因为不同的客户以不同的方式使用它们。
由于这些是枚举,您可以将它们包装在具有接口隔离的类中,或者至少区分两个枚举。