我想创建一个扩展方法来检查枚举是否有一个标志.
DaysOfWeek workDays = DaysOfWeek.Monday | DaysOfWeek.Tuesday | DaysOfWeek.Wednesday;
// instead of this:
if ((workDays & DaysOfWeek.Monday) == DaysOfWeek.Monday)
...
// I want this:
if (workDays.ContainsFlag(DaysOfWeek.Monday))
...
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?(如果有一个类已经完成了这个,那么我会很感激如何解释这个问题;我已经把这个方法弄得太久了!)
提前致谢
[Flags]
public enum MyEnum
{
None = 0,
Setting1 = (1 << 1),
Setting2 = (1 << 2),
Setting3 = (1 << 3),
Setting4 = (1 << 4),
}
Run Code Online (Sandbox Code Playgroud)
我需要能够以某种方式循环每个可能的设置并将设置组合传递给函数.可悲的是,我一直无法弄清楚如何做到这一点
Scala中没有等效的标志吗?
就像是 :
val flags = Something | SomeOtherThing
Run Code Online (Sandbox Code Playgroud)
我想我可以为每个旗帜组做一个班级并且有一堆布尔但是语法糖怎么样?
编译但不应该
[Flags]
enum TransactionData : long // 64 bits. Last bit is sign bit, but I'm putting data there
{
None = 0,
Color1 = 1 << 63,
}
Run Code Online (Sandbox Code Playgroud)
错误但不应该
[Flags]
enum TransactionData : ulong // 64 bits. No sign bit. Not allowed to put data there
{
None = 0,
Color1 = 1 << 63,
}
Run Code Online (Sandbox Code Playgroud)
编译器错误文本:
-2147483648无法转换为ulong
题:
我希望会发生相反的情况.谁能解释为什么会这样?
我也可以如何打印这个flags属性byte[]进行检查?
var eee = TransactionData.None | TransactionData.Color1
// How do I convert eee to byte[]?
Run Code Online (Sandbox Code Playgroud) c# compiler-construction enums enum-flags visual-studio-2013
我遇到过这个问题:[Flags]枚举属性在C#中意味着什么?
有一点我一直想知道,使用接受的答案的例子,如果我宣布会发生什么:
[Flags]
public enum MyColors
{
Yellow = 1,
Green = 2,
Red = 3,
Blue = 4
}
Run Code Online (Sandbox Code Playgroud)
该示例中的以下步骤是否会导致错误?如果不是,我怎样才能进入MyColors.Red?
EDIT:
Most people suggest that flag enums should always have values of powers of two. That may be best practice but I am not defining enums here, rather checking them and want to cover all possible scenarios within reason. The question is really about the proper way to implement the function named EnumUtilities.IsValueDefinedAndComposite<T>.
ORIGINAL POST:
Consider the following Enum:
[Flags]
public enum TestWithFlags { One = 1, Two = 2, }
Run Code Online (Sandbox Code Playgroud)
Following is the result of Enum.IsDefined with various …
我有这个枚举:
[Flags]
public enum Countries
{
None = 0,
USA = 1,
Mexico = 2,
Canada = 4,
Brazil = 8,
Chile = 16
}
Run Code Online (Sandbox Code Playgroud)
我收到这样的输入字符串:
string selectedCountries = "Usa, Brazil, Chile";
Run Code Online (Sandbox Code Playgroud)
如何将其(在 C# 中)转换回:
var myCountries = Countries.Usa | Countries.Brazil | Countries.Chile;
Run Code Online (Sandbox Code Playgroud) 我知道你可以用这种方式配置C#enum标志:
[Flags]
public enum MyEnum
{
Unknown = 0,
Type1 = 1,
Type2 = 2,
Type3 = 4,
Type4 = 8,
Type5 = 16
}
Run Code Online (Sandbox Code Playgroud)
一旦配置完毕,您就可以代表一组这样的枚举:
MyEnum enumerationSet = MyEnum.Type1 | MyEnum.Type2
Run Code Online (Sandbox Code Playgroud)
然后,您可以对此集进行检查,例如:
if(enumerationSet.HasFlag(MyEnum.Type1))
{
// Do something
}
Run Code Online (Sandbox Code Playgroud)
或者打印他们的值,如下:
Console.WriteLine("{0}", enumerationSet);
Run Code Online (Sandbox Code Playgroud)
哪个会打印:
Type1, Type2
Run Code Online (Sandbox Code Playgroud)
但是,我可以按相反顺序进行吗?例如,如果我知道的话
MyEnum.Type1 | MyEnum.Type2 == 3
Run Code Online (Sandbox Code Playgroud)
那我可以问MyEnum一下它的价值/类型是什么等于3?然后,我可以创建一个扩展方法(GetSet)来执行如下:
List<MyEnum> myEnumSetList = MyEnum.GetSet(3)
Run Code Online (Sandbox Code Playgroud)
返回一MyEnum组或一组值,即{1, 2}.
请指教.
编辑:我终于搞清楚了.在下面发表我的答案.
我正在尝试检查“枚举实例”是否包含多个标志。
[Flags]
public enum Foo
{
Bar = 1,
Far = 2
}
Run Code Online (Sandbox Code Playgroud)
var multiState = Foo.Bar | Foo.Far;
MoreThanOneFlag(multiState); // True
var singleState = Foo.Bar;
MoreThanOneFlag(singleState); // False
Run Code Online (Sandbox Code Playgroud)
另外我真的不想使用类似下面的东西:
var state = Foo.Bar | Foo.Far;
Console.WriteLine(state.ToString().Count(x => x == ',') > 0); // True
Run Code Online (Sandbox Code Playgroud)
请注意,我不关心“实例”包含哪些标志,我只想知道是否有多个标志。
在某些情况下,当我将Enum传递给方法时,我需要处理它是否是单个Enum值,否则它是一个标志组合,为此我编写了这个简单的扩展:
Vb.Net:
<Extension>
Public Function FlagCount(ByVal sender As System.[Enum]) As Integer
Return sender.ToString().Split(","c).Count()
End Function
Run Code Online (Sandbox Code Playgroud)
C#(在线翻译):
[Extension()]
public int FlagCount(this System.Enum sender) {
return sender.ToString().Split(',').Count();
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
Vb.Net:
Dim flags As FileAttributes = (FileAttributes.Archive Or FileAttributes.Compressed)
Dim count As Integer = flags.FlagCount()
MessageBox.Show(flagCount.ToString())
Run Code Online (Sandbox Code Playgroud)
C#(在线翻译):
FileAttributes flags = (FileAttributes.Archive | FileAttributes.Compressed);
int count = flags.FlagCount();
MessageBox.Show(flagCount.ToString());
Run Code Online (Sandbox Code Playgroud)
我只是想问一下,如果存在一种更直接,更有效的方式,我现在正在做的是避免将标志组合表示为String然后拆分它.