我需要将C结构转换为使用位字段的C#.
typedef struct foo
{
unsigned int bar1 : 1;
unsigned int bar2 : 2;
unsigned int bar3 : 3;
unsigned int bar4 : 4;
unsigned int bar5 : 5;
unsigned int bar6 : 6;
unsigned int bar7 : 7;
...
unsigned int bar32 : 32;
} foo;
Run Code Online (Sandbox Code Playgroud)
有人知道怎么做吗?
我有这种情况,用户有自己的角色
普通用户
托管
金融
托管人和财务部都是超级用户
如何检查角色托管人是否是超级用户
这是我的示例代码..
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication3
{
public enum Role
{
NormalUser = 0,
Custodian = 1,
Finance = 2,
SuperUser = Custodian | Finance,
All = Custodian | Finance | NormalUser
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Normal: " + Convert.ToInt32(Role.NormalUser));
Console.WriteLine("Custodian: " + Convert.ToInt32(Role.Custodian));
Console.WriteLine("Finance: " + Convert.ToInt32(Role.Finance));
Console.WriteLine("SuperUser: " + Convert.ToInt32(Role.SuperUser));
Console.WriteLine("All: " + Convert.ToInt32(Role.All));
Console.WriteLine();
Console.WriteLine("Normal User is …Run Code Online (Sandbox Code Playgroud) 我正在设计我的MVC应用程序的用户设置,现在我有~20个布尔设置,用户可以切换.由于每个用户总是会进行所有设置,因此我考虑将每个设置存储为User表中的布尔值.虽然随着应用程序需求的增长,这将变得难以处理.
第一个问题 - 在这种情况下,你的桌子上有大量的柱子有什么问题吗?
然后我考虑使用Flags,并将设置存储为数组中的每一位:
[Flags]
public enum Settings
{
WantsEmail = 1,
WantsNotifications = 2,
SharesProfile = 4,
EatsLasagna = 8
}
Run Code Online (Sandbox Code Playgroud)
然后每个用户在其用户行中将有一个"设置"列,如果有20个设置,则存储值为2 ^ 20.
我用这个来指导我的努力:[Flags] Enum属性在C#中意味着什么?
这比前一种做法好吗?欢迎任何建议.
我正在为我的问题寻找一个好的模式.
我有一些bool变量:
condition1,condition2,condition3.
我也有一些动作,在课堂内的不同地方调用:
动作1,动作2,ACTION3
当条件1和2为真时,调用Action1.当条件2和3为真时,将调用action2.当所有条件都为真时,将调用操作3.
当然,这只是问题的简化.我不想在每个地方使用if else.这非常不清楚.
我一直在考虑状态,但我想这不是解决这个问题的最佳方法.
假设你有
enum MyEnum {A = 0, B = 1, C = 2, D = 4, E = 8, F = 16};
在某些时候,您有一个函数将检查MyEnum的实例,如果它是C,D或F则返回true
bool IsCDF(MyEnum enumValue)
{
return //something slick
}
Run Code Online (Sandbox Code Playgroud)
我记得有一些非常光滑的方法来进行位移和预先形成这种操作,比一堆三元if语句读取方式更好但是对于我的生活我不记得它是什么.
谁知道?
我有一个类"许可证",它是一堆枚举标志的集合,如下所示:
Public class License
{
UsageType Usage { get; set; }
PlatformType Platform { get; set; }
public enum UsageType { read = 1, write = 2, wipe = 4, all = 7 }
public enum PlatformType { windows = 1, linux = 2, ios = 4, all = 7 }
etc...
}
Run Code Online (Sandbox Code Playgroud)
关键是可以将相同类别的各种标志一起进行"或"运算,以形成用户可以对所述许可证执行的操作的配置文件.现在我试图以人性化的方式显示"Usage"和"Platform"的值,例如,如果Usage == UsageType.read | UsageType.write然后它应该被解析为"读,写".
我通过测试每个标志的值并为每个标志附加enumitem.ToString()为一个字符串来成功地使用单个枚举类型.既然我有很多这些枚举和价值,我想提出一个更通用的方法.
我提出了这个(下面),但由于我不熟悉c#中的模板函数所以我不知道为什么这不起作用,但至少它应该说明我的意思:
private string parseEnum<T>(T value)
{
string ret = "";
foreach (var ei in (T[])Enum.GetValues(typeof(T)))
{
if (value.HasFlag(ei)) ret += ei.ToString() …Run Code Online (Sandbox Code Playgroud) 编辑:似乎大多数人误解了我的问题.
我知道枚举是如何运作的,我知道二进制.我想知道为什么带有[Flags]属性的枚举是按原样设计的.
原帖:
这可能是重复的,但我没有找到任何其他帖子,所以这里.
我打赌它背后有一些很好的理由,我发现它有点容易出错.
[Flag]
public enum Flagged
{
One, // 0
Two, // 1
Three, // 2
Four, // 3
}
Flagged f; // Defaults to Flagged.One = 0
f = Flagged.Four;
(f & Flagged.One) != 0; // Sure.. One defaults to 0
(f & Flagged.Two) != 0; // 3 & 1 == 1
(f & Flagged.Three) != 0; // 3 & 2 == 2
Run Code Online (Sandbox Code Playgroud)
如果做到这样的话会不会更有意义?
[Flag]
public enum Flagged
{
One = 1 << 0, …Run Code Online (Sandbox Code Playgroud) 我发现有或没有flags属性,如果我定义了以下枚举,我可以做位操作
enum TestType
{
None = 0x0,
Type1 = 0x1,
Type2 = 0x2
}
Run Code Online (Sandbox Code Playgroud)
我想知道为什么我们需要flags属性?
我正在为我们的应用程序做一个简单的实体更改日志记录.出现的一个问题是,虽然DbEntityEntry.State属性的枚举值明显是互斥的(参见MSDN),但它是使用Flags属性定义的,并且选择的值就好像它们可以组合一样.
假设这些值互相排斥是否安全?他们为什么选择这条道路?
我有一个带标志的枚举.我想声明一个带有n不同标志的变量.n > 1在这种情况下.
public enum BiomeType {
Warm = 1,
Hot = 2,
Cold = 4,
Intermediate = 8,
Dry = 16,
Moist = 32,
Wet = 64,
}
Run Code Online (Sandbox Code Playgroud)
好的 - 一个变体是将每个标志转换为一个字节并将结果转换为我的枚举.
BiomeType bType = (BiomeType)((byte)BiomeType.Hot + (byte)BiomeType.Dry)
Run Code Online (Sandbox Code Playgroud)
但这有点混乱 - imho.是否有更可读的方式来组合标志?