我正在捕捉一个KeyDown事件,我需要能够检查当前按下的键是否为:Ctrl+ Shift+ M ?
我知道我需要使用e.KeyData来自KeyEventArgs中,Keys枚举和一些与枚举标志和位,但我不知道如何检查相结合.
设备将限制开关的状态报告为一系列零(表示包含"010111110000"的字符串).这些开关的理想表示形式是这样的标志枚举:
[Flags]
public enum SwitchStatus
{
xMin,
xMax,
yMin,
yMax,
aMax,
bMax,
cMax,
unknown4,
unknown3,
unknown2,
unknown1,
unknown0
}
Run Code Online (Sandbox Code Playgroud)
是否可以将字符串表示转换为枚举?如果是这样,怎么样?
如果我有一个可以同时出现的多个值的枚举,我创建一个Flags枚举:
[Flags]
public enum Foo
{
None = 0,
A = 1,
B = 2,
C = 4,
D = 8
}
Run Code Online (Sandbox Code Playgroud)
如果我现在想要传递每个值都设置的事实,我将不得不做这样的事情:
Bar bar = new Bar(Foo.A | Foo.B | Foo.C | Foo.D);
Run Code Online (Sandbox Code Playgroud)
添加额外元素All会被视为不良做法/有害/亵渎吗?
All = 15
Run Code Online (Sandbox Code Playgroud)
当存在大量值并且将它们全部传递时,这将节省一些空间和时间是常见的情况.
据我所知,标志枚举(=位域)的机制,这应该工作.我不知道有任何副作用或其他原因你不应该这样做吗?
我有一个包含几个标志的XML,其中一些是无符号的32位整数,另一些是无符号的64位整数.其中一些是用逗号分隔的列表编写的,另一些是十六进制的.
看这个例子:
<Color>Blue,Red</Color>
<Color>0xC</Color>
Run Code Online (Sandbox Code Playgroud)
因为我不想编写解析每个枚举的方法,所以我决定使用泛型方法.但Visual Studio不会让我构建解决方案.这是我的方法:
public static T ParseFlags<T>(string value) where T : struct
{
T result = (T)((object)0);
string[] array;
// Remove white spaces and delimit string if it is comma-separated
if (ParseDelimitedString(value, ',', out array))
{
for (int i = 0; i < array.Length; i++)
{
T flag = (T)((object)0);
// Check if value is member of enumeration
if (Enum.TryParse<T>(array[i], out flag))
{
result |= (T)((object)flag);
}
}
}
else
{
switch (Type.GetTypeCode(Enum.GetUnderlyingType(typeof(T))))
{
// Remove hex …Run Code Online (Sandbox Code Playgroud) 我有一个这样定义的枚举:
[Flags]
public enum Orientation
{
North = 1,
North_East = 2,
East = 4,
South_East = 8,
South = 16,
South_West = 32,
West = 64,
North_West = 128
}
Run Code Online (Sandbox Code Playgroud)
是否有一种通用方法可以判断是否设置了一个标志、多个标志还是没有设置?我不关心枚举的值是什么,我只想知道设置了多少个标志。
这不是用于计算位数的重复。如果我像这样初始化枚举并计算位数,我会得到 10。但是设置标志的数量将为 8。
GeographicOrientation go = (GeographicOrientation) 1023;
Run Code Online (Sandbox Code Playgroud) 根据我的代码a = 1,b = 2,c = 3等我认为该标志会使a = 1,b = 2,c = 4等
[Flags]
public enum someEnum { none, a, b, c, d, e, f, }
Run Code Online (Sandbox Code Playgroud)
我如何得到我的意图(c = 4,e = 8)?[Flags]上面的意思是什么?
在C#中,我试图将"值"添加到接受枚举标志的参数中.我可以在一行上使用按位运算符"|",但我似乎无法在循环中追加参数.
我将以下Enum指定为Flags.
[Flags]
public enum ProtectionOptions
{
NoPrevention = 0,
PreventEverything = 1,
PreventCopying = 2,
PreventPrinting = 4,
PrintOnlyLowResolution = 8
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以轻松地使用以下代码向参数添加标志值:
myObj.Protection = ProtectionOptions.PreventEverything | ProtectionOptions.PrintOnlyLowResolution;
Run Code Online (Sandbox Code Playgroud)
但是,我想要做的,就是通过它们获得的从CSV字符串(从web.config)保护选项,循环列表,并将它们添加到我的myObj.ProtectionOptions财产.我不知道如何在循环中执行此操作而不使用按位OR"|" 运营商.这是我想要做的:
string protectionOptionsString = "NoPrevention, PreventPrinting";
string[] protectionOptions = protectionOptionsString.Split(',');
foreach (string protectionOption in protectionOptions)
{
myObj.Protection += (ProtectionOptions) Enum.Parse(typeof (ProtectionOptions), protectionOption.Trim());
}
Run Code Online (Sandbox Code Playgroud)
从概念上讲,这就是我想要的,但我不能"+ ="循环中的值到参数.
如果您反思WPF System.Windows.Controls.Control类,您可以看到:
public class Control : FrameworkElement
{
internal ControlBoolFlags _controlBoolField;
// [...]
internal bool ReadControlFlag(ControlBoolFlags reqFlag);
internal void WriteControlFlag(ControlBoolFlags reqFlag, bool set);
// I think it's clear what they do
// [...]
internal enum ControlBoolFlags : ushort
{
CommandDisabled = 8,
ContainsSelection = 128,
ContentIsItem = 16,
ContentIsNotLogical = 1,
HeaderIsItem = 32,
HeaderIsNotLogical = 4,
IsSpaceKeyDown = 2,
ScrollHostValid = 64,
VisualStateChangeSuspended = 256
}
}
Run Code Online (Sandbox Code Playgroud)
所以我只想知道为什么MS选择这种方式来存储布尔值而不是bool为每个标志使用一个字段.它只是他们的编码风格,他们只是想为每个领域节省空间吗?
我打算制作一个以表格形式显示有关用户信息的页面。每列将是表的属性。我希望查看表的人能够选择过滤用户的方式。将有两个复选框:1用于报告用户,1用于创建日期。我打算制作一个名为UserFilter的枚举,如下所示:
public enum UserFilter
{
None = 0,
Date = 1,
Reported = 2
}
Run Code Online (Sandbox Code Playgroud)
如果我需要添加其他类型,则将其值设置为4,这样我就可以通过按位或(3分别是1和2)来判断选择哪个枚举。我遇到的问题是从查询字符串中读取枚举。我想我可以做一些像int一样的回发(0表示无,1表示日期,2表示报表,3表示两者),但是我想尝试使用实际的字符串回发。我不确定如何将“ Date | Reported”解析为UserFilter中不存在的枚举值。
简而言之:是否有一种干净的方法可以将“ Date | Reported”解析为值3,而不向枚举添加另一个值?
我有这个枚举:
[Flags]
public enum Actions
{
None = 0,
MoveUp = 1,
MoveDown = 2,
MoveRight = 3,
MoveLeft = 4
}
Run Code Online (Sandbox Code Playgroud)
我想要这样的表的列:
Id | UserId | Actions
.. | .. | ..
Run Code Online (Sandbox Code Playgroud)
我对如何存储枚举感到困惑,因为用户可以有多个操作,并且我不想使用另一张表来存储操作。我有超过 50 个操作,这就是我使用该Flags属性的原因。
actionssUser = Actions.MoveUp | Actions.MoveRight | .......
Run Code Online (Sandbox Code Playgroud) c# ×10
enum-flags ×10
enums ×7
.net ×1
attributes ×1
bitflags ×1
boolean ×1
coding-style ×1
filter ×1
keyeventargs ×1
sql ×1
string ×1
wpf ×1
xml ×1