相关疑难解决方法(0)

如何检查是否设置了标志组合的标志?

假设我有这个枚举:

[Flags]
enum Letters
{
     A = 1,
     B = 2,
     C = 4,
     AB = A | B,
     All = A | B | C,
}
Run Code Online (Sandbox Code Playgroud)

要检查是否AB已设置,我可以这样做:

if((letter & Letters.AB) == Letters.AB)
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来检查组合标志常量的任何标志是否设置为以下?

if((letter & Letters.A) == Letters.A || (letter & Letters.B) == Letters.B)
Run Code Online (Sandbox Code Playgroud)

你可以换&一些东西吗?

对于像这样的二进制文件来说不太稳定......

c# enums flags

165
推荐指数
11
解决办法
14万
查看次数

循环"选定"枚举值?

我知道如何遍历枚举列表的属性,但我如何循环所有"选定"枚举属性?例如,如果有人Prop1 | Prop2反对public enum Foo { Prop1; Prop2; Prop3 },我将如何实现这一目标?

这就是我现在拥有的:

var values = Enum.GetValues(typeof(FileStatus)).Cast<FileStatus>();
foreach (var value in values)
{
}
Run Code Online (Sandbox Code Playgroud)

它循环遍历所有枚举属性,但我只想循环那些被"选中"的属性.

更新:[Flags]属性已设置.

更新2:枚举包含大量属性,我不能也不会键入/硬编码单个属性检查,而是我想动态遍历每个属性并检查我的枚举实例是否Bar包含循环项集.

c#

12
推荐指数
1
解决办法
6347
查看次数

打印标志枚举作为单独的标志

我有一个像这样定义的标志枚举:

[Flags]
public enum MyEnum
{
    None =     0x00,
    Choice1 =  0x01,
    Choice2 =  0x02,
    Choice3 =  0x04,
    Default =  Choice1 | Choice2,
    All =      Default | Choice3
}
Run Code Online (Sandbox Code Playgroud)

我想要一种方法来打印出包含哪些标志MyEnum.Default.在这种情况下,我希望输出类似于"Choice1,Choice2".

简单打印的问题MyEnum.Default.ToString()是当我想要"Choice1,Choice2"时输出将是"默认".

这是一个选项,但如果我使用它,我每次更改枚举时都必须更新打印.

((StudyData.Choice1 & StudyData.Default) == StudyData.Choice1 ? StudyData.Choice1.ToString() : "") + ", " +
((StudyData.Choice2 & StudyData.Default) == StudyData.Choice2 ? StudyData.Choice2.ToString() : "") + ", " +
((StudyData.Choice3 & StudyData.Default) == StudyData.Choice3 ? StudyData.Choice3.ToString() : "")
Run Code Online (Sandbox Code Playgroud)

有没有人有更清洁的方式这样做?理想情况下,我想要一种打印出包含的标志的方法,MyEnum.Default而不必在每次添加新标志或更改默认值时更改打印代码.

谢谢!

c# enums flags

9
推荐指数
2
解决办法
6975
查看次数

枚举对字符串的描述

我有以下ENUM:

[Flags]
public enum DataFiat {

  [Description("Público")]
  Public = 1,

  [Description("Filiado")]
  Listed = 2,

  [Description("Cliente")]
  Client = 4

} // DataFiat
Run Code Online (Sandbox Code Playgroud)

我创建了一个扩展来获取Enum属性:

public static T GetAttribute<T>(this Enum value) where T : Attribute {

  T attribute;
  MemberInfo info = value.GetType().GetMember(value.ToString()).FirstOrDefault();
  if (info != null) {
    attribute = (T)info.GetCustomAttributes(typeof(T), false).FirstOrDefault();
    return attribute;
  }
  return null;
}
Run Code Online (Sandbox Code Playgroud)

这适用于非Flags Enums ...但是当我有:

var x = DataFiat.Public | DataFiat.Listed;
var y = x.GetAttribute<Description>();
Run Code Online (Sandbox Code Playgroud)

y的值为null ...

我想得到"Público,Filiado,Cliente"......就像ToString()一样.

如何更改我的扩展程序才能使其正常工作?

谢谢

c# enums

8
推荐指数
1
解决办法
4534
查看次数

从组合枚举值中获取所有枚举常量的更好方法

我正在尝试从Type枚举变量中获取所有枚举值:

[Flags]
    enum Type
    {
        XML = 1,
        HTML = 2,
        JSON = 4,
        CVS = 8
    }


static void Main(string[] args)
{

    Type type = Type.JSON | Type.XML;

    List<Type> types = new List<Type>();

    foreach (string elem in type.ToString().Split(',') )
        types.Add(  (Type)Enum.Parse( typeof(Type), elem.Trim() ) );          

}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

c# enums

3
推荐指数
1
解决办法
129
查看次数

迭代Flags Enum中的值 - 但保留顺序

我的enum代码中有以下内容:

[Flags]
public enum Column
{
    FirstName = 1 << 0,
    LastName = 1 << 1,
    Address = 1 << 2,
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个可以采取的方法enum.

public void ParseColumns(Column col)
{
    //do some parsing...
}
Run Code Online (Sandbox Code Playgroud)

可以像这样调用此方法:

ParseColumns(Column.FirstName | Column.LastName);
ParseColumns(Column.LastName);
ParseColumns(Column.LastName | Column.Address | Column.FirstName);
ParseColumns(Column.Address | Column.FirstName);
Run Code Online (Sandbox Code Playgroud)

我现在需要遍历值,但保持enum传递给方法的顺序.

我找到了下面的方法,它让我可以迭代它们,但遗憾的是它返回它在Enum自身中定义的顺序,而不是我如何调用方法. 迭代Flags Enum中的值?

c# enums

2
推荐指数
1
解决办法
596
查看次数

将多个枚举传递给方法并获取它们的值

请考虑以下代码:

public enum Status
{
    S1 = 1,
    S2 = 2,
    S3 = 3,
    S4 = 4
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用|oerator 将多个枚举传递给一个方法:

public void DoWork(Status S)
{
}
...
DoWork(Status.S1 | Status.S2);
Run Code Online (Sandbox Code Playgroud)

现在在DoWork方法中我想获取传递的枚举值.例如在上面的代码我想得到{1, 2}.我怎么做这个?谢谢

c# enums c#-4.0

2
推荐指数
1
解决办法
1239
查看次数

标签 统计

c# ×7

enums ×6

flags ×2

c#-4.0 ×1