我在处理一些具有多个零值的遗留枚举时遇到了困难。每当我对其中一个非零值调用 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);
关于c# - 从具有多个零值的枚举中获取项目名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9073777/