是否有一种方法可以选择强制[Flags]枚举为“非标志”用于特定用途?
例如,假设我有
enum MyEnum {
X ,
Y ,
Z
}现在假设我有两个类A和B。B类将主要用于IEnumerable<B>中。类A负责解析此列表,但仅当枚举与特定值匹配时;
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
}
}
}
}现在,假设我希望A类能够使用多种类型的B,我可以将Flags属性添加到我的枚举中,并执行如下操作:
[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
}
}
}
}但是,B类的MyProperty现在可以用作标志,这是一个问题,因为B.MyProperty上下文中没有MyEnum.X | MyEnum.Y这样的东西。这在A内部是有意义的,因为我针对的是各种类型的B类。
我想出的工作是:
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,以便能够将值传递给Enum.HasFlag。当然,我可以做一些明智的操作,但并不总是那么明显,目的是什么。不管怎样,我还是需要两个“匹配的”枚举。
有没有更好的方法来解决这个问题?是否有办法在B.MyProperty上使用单个枚举类型并强制使用某种类型的B.MyProperty属性。还是让这两个机构被认为是最好的方法/良好做法?
如果这件事重要的话,我在用C#6.0
发布于 2015-12-14 13:09:15
从根本上说,每种枚举类型要么设计为有一点掩码,要么没有。
A.Property成为一个List<MyEnum>或类似的B.Property设置器验证只设置了一个位,否则抛出一个ArgumentException。发布于 2015-12-14 13:11:04
这两种用途有什么不同?听起来这些应该是两个不同的枚举,因为它们的含义是不同的。它们使用的合同是不同的。如果这些是类,我建议应用界面偏析原理,因为不同的客户机以不同的方式使用它们。
由于它们是枚举,所以可以将它们封装在具有接口隔离的类中,或者至少区分这两个枚举。
https://stackoverflow.com/questions/34267829
复制相似问题