c# - 从具有多个零值的枚举中获取项目名称

我在处理一些具有多个零值的遗留枚举时遇到了困难。每当我对其中一个非零值调用 ToString 时,除了第一个零值之外的所有值都包括在内。

有什么方法可以在不借助字符串操作或反射的情况下隔离非零值名称?

//all of the following output "Nada, Zilch, One"
Console.WriteLine(TestEnum.One);
Console.WriteLine(Convert.ToString(TestEnum.One));
Console.WriteLine(TypeDescriptor.GetConverter(typeof(TestEnum))
                      .ConvertToString(TestEnum.One));

[Flags]
enum TestEnum
{
    Zero = 0,
    Nada = 0,
    Zilch = 0,
    One = 1
}

编辑

我了解不建议使用具有相同值的多个项目,但是有问题的枚举是在我无法更改的旧程序集中定义的。事实上,mscorlib v4 中有 12 个公共(public)枚举违反了此建议,由以下简单的 LINQ 查询确定:

var types = typeof (void).Assembly.GetTypes()
    .Where(type => type.IsEnum &&
                   type.IsPublic &&
                   Enum.GetValues(type).Cast<object>()
                       .GroupBy(value => value)
                       .Any(grp => grp.Count() > 1))
    .ToList();

最佳答案

这是一种选择。它有效,但它有点难看。值/名称变量不会改变,因此只需要计算一次。

假设你有一个稍微复杂一点的枚举,比如:

[Flags]
public enum TestEnum
{
    Zero = 0,
    Nada = 0,
    Zilch = 0,
    One = 1,
    Two = 2,
    Three = 3,
    Four = 4
}

这里有一些你可以使用的代码:

var input = TestEnum.One | TestEnum.Two;
var values = (TestEnum[]) Enum.GetValues(typeof (TestEnum));
var names = Enum.GetNames(typeof (TestEnum));
var result = values
    .Select((value, index) =>
            input == value || (value != 0 && (input & value) == value)
                ? names[index]
                : null)
    .Where(name => name != null);
var text = string.Join(", ", result);
Console.WriteLine(text);

https://stackoverflow.com/questions/9073777/

相关文章:

c++ - 如何打印 '\n' 而不是换行符?

visual-studio - ASP.NET MVC 查看代码格式 - 大括号 <% } %>

php - 分离 php 和 html... 为什么?

LaTeX - 在序列中每个新行的开头添加不同数量的水平间距

java - 如何将 LocalDate 对象格式化为 MM/dd/yyyy 并保持格式不变

intellij-idea - IntelliJ : wrap javadoc text but n

r - DataTables 也应用列格式来过滤

python - 狮身人面像浮点格式

python - 编码风格 - 将括号保持在同一行或新行上?

regex - 删除 Notepad++ 中的第一列