C# 枚举从值列表验证
C# Enum validate from list of values
我在某处看到(再也找不到),您可以使用特定的项目列表检查枚举项目中的枚举值是否存在。前任。下面 - "Available = doc | xls | csv"
但是下面的代码好像不起作用。我希望结果是 = xls 而不是 doc,因为它在 "Available" 值列表中。
有人可以帮忙吗?
提前致谢!
尼基
按钮代码:
protected void btnTest01_Click(object sender, EventArgs e)
{
TestEnum01 result1 = TestEnum01.xls;
TestEnum02 result2 = TestEnum02.xls;
TestEnum03 result3 = TestEnum03.xls;
if (result1 != TestEnum01.Available)
{
result1 = TestEnum01.doc;
}
if (result2 != TestEnum02.Available)
{
result2 = TestEnum02.doc;
}
if (result3 != TestEnum03.Available)
{
result3 = TestEnum03.doc;
}
this.txtTest01_Results.Text =
String.Format("01: Result = {0}, Available = {1}\r\n\r\n02: Result = {2}, Available = {3}\r\n\r\n03: Result = {4}, Available = {5}",
result1.ToString(), TestEnum01.Available,
result2.ToString(), TestEnum02.Available,
result3.ToString(), TestEnum03.Available);
}
枚举
public enum TestEnum01
{
doc = 1,
txt = 2,
xls = 4,
csv = 8,
unknown = 5,
Available = doc | xls | csv
}
public enum TestEnum02
{
doc,
txt,
xls,
csv,
unknown,
Available = doc | xls | csv
}
public enum TestEnum03
{
doc,
txt,
xls,
csv,
unknown,
Available = TestEnum03.doc | TestEnum03.xls | TestEnum03.csv
}
结果:
01: Result = doc, Available = Available
02: Result = doc, Available = csv
03: Result = doc, Available = csv
你必须使用 FlagsAttribute :
[Flags]
public enum TestEnum01
{
doc = 1,
txt = 2,
xls = 4,
csv = 8,
unknown = 5,
Available = doc | xls | csv
}
然后进行测试:
TestEnum01 test = TestEnum01.doc | TestEnum01.txt;
bool isDoc = (test & TestEnum01.doc) == TestEnum01.doc;
请注意,在您的示例中,unknown
值会出现问题,因为二进制方式为 1 | 4 = 5 ...这意味着 doc 和 xls 产生未知...为了避免此类问题,我更喜欢使用直接位移表示法:
[Flags]
public enum TestEnum01
{
unknown = 0,
doc = 1 << 0,
txt = 1 << 1,
xls = 1 << 2,
csv = 1 << 3,
Available = doc | xls | csv
}
如果你只是想测试一个特定的标志,你可以只使用HasFlag()
方法
TestEnum01 test = TestEnum01.doc | TestEnum01.txt;
bool isDoc = test.HasFlag(TestEnum01.doc);
我在某处看到(再也找不到),您可以使用特定的项目列表检查枚举项目中的枚举值是否存在。前任。下面 - "Available = doc | xls | csv"
但是下面的代码好像不起作用。我希望结果是 = xls 而不是 doc,因为它在 "Available" 值列表中。
有人可以帮忙吗?
提前致谢!
尼基
按钮代码:
protected void btnTest01_Click(object sender, EventArgs e)
{
TestEnum01 result1 = TestEnum01.xls;
TestEnum02 result2 = TestEnum02.xls;
TestEnum03 result3 = TestEnum03.xls;
if (result1 != TestEnum01.Available)
{
result1 = TestEnum01.doc;
}
if (result2 != TestEnum02.Available)
{
result2 = TestEnum02.doc;
}
if (result3 != TestEnum03.Available)
{
result3 = TestEnum03.doc;
}
this.txtTest01_Results.Text =
String.Format("01: Result = {0}, Available = {1}\r\n\r\n02: Result = {2}, Available = {3}\r\n\r\n03: Result = {4}, Available = {5}",
result1.ToString(), TestEnum01.Available,
result2.ToString(), TestEnum02.Available,
result3.ToString(), TestEnum03.Available);
}
枚举
public enum TestEnum01
{
doc = 1,
txt = 2,
xls = 4,
csv = 8,
unknown = 5,
Available = doc | xls | csv
}
public enum TestEnum02
{
doc,
txt,
xls,
csv,
unknown,
Available = doc | xls | csv
}
public enum TestEnum03
{
doc,
txt,
xls,
csv,
unknown,
Available = TestEnum03.doc | TestEnum03.xls | TestEnum03.csv
}
结果:
01: Result = doc, Available = Available
02: Result = doc, Available = csv
03: Result = doc, Available = csv
你必须使用 FlagsAttribute :
[Flags]
public enum TestEnum01
{
doc = 1,
txt = 2,
xls = 4,
csv = 8,
unknown = 5,
Available = doc | xls | csv
}
然后进行测试:
TestEnum01 test = TestEnum01.doc | TestEnum01.txt;
bool isDoc = (test & TestEnum01.doc) == TestEnum01.doc;
请注意,在您的示例中,unknown
值会出现问题,因为二进制方式为 1 | 4 = 5 ...这意味着 doc 和 xls 产生未知...为了避免此类问题,我更喜欢使用直接位移表示法:
[Flags]
public enum TestEnum01
{
unknown = 0,
doc = 1 << 0,
txt = 1 << 1,
xls = 1 << 2,
csv = 1 << 3,
Available = doc | xls | csv
}
如果你只是想测试一个特定的标志,你可以只使用HasFlag()
方法
TestEnum01 test = TestEnum01.doc | TestEnum01.txt;
bool isDoc = test.HasFlag(TestEnum01.doc);