如何循环遍历常量的静态类
本文关键字:遍历 常量 静态类 循环 何循环 | 更新日期: 2023-09-27 18:17:28
不使用下面代码中所示的Switch语句,是否有另一种方法来检查foo.Type
是否与Parent.Child
类中的任何常量匹配?
预期的目标是遍历所有常数值以查看foo.Type
是否匹配,而不是必须将每个常数指定为case
。
:
public class Parent
{
public static class Child
{
public const string JOHN = "John";
public const string MARY = "Mary";
public const string JANE = "Jane";
}
}
代码:switch (foo.Type)
{
case Parent.Child.JOHN:
case Parent.Child.MARY:
case Parent.Child.JANE:
// Do Something
break;
}
使用反射可以找到类中的所有常量值:
var values = typeof(Parent.Child).GetFields(BindingFlags.Static | BindingFlags.Public)
.Where(x => x.IsLiteral && !x.IsInitOnly)
.Select(x => x.GetValue(null)).Cast<string>();
然后你可以检查values是否包含一些东西:
if(values.Contains("something")) {/**/}
虽然您可以循环使用反射声明的常量(如其他答案所示),但这并不理想。
将它们存储在某种可枚举对象中会更有效:数组、列表、ArrayList,任何最符合你要求的对象。
类似:
public class Parent {
public static List<string> Children = new List<string> {"John", "Mary", "Jane"}
}
:
if (Parent.Children.Contains(foo.Type) {
//do something
}
您可以使用反射来获取给定类的所有常量:
var type = typeof(Parent.Child);
FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Public |
BindingFlags.Static | BindingFlags.FlattenHierarchy);
var constants = fieldInfos.Where(f => f.IsLiteral && !f.IsInitOnly).ToList();
var constValue = Console.ReadLine();
var match = constants.FirstOrDefault(c => (string)c.GetRawConstantValue().ToString() == constValue.ToString());