How to loop through a static class of constants?
除了使用下面代码中所示的switch语句之外,是否还有其他方法来检查
预期目标是循环遍历所有常量值,以查看
父类:
1 2 3 4 5 6 7 8 9 | public class Parent { public static class Child { public const string JOHN ="John"; public const string MARY ="Mary"; public const string JANE ="Jane"; } } |
代码:
1 2 3 4 5 6 7 8 | switch (foo.Type) { case Parent.Child.JOHN: case Parent.Child.MARY: case Parent.Child.JANE: // Do Something break; } |
您可以在类中找到所有常量值:
1 2 3 | var values = typeof(Parent.Child).GetFields(BindingFlags.Static | BindingFlags.Public) .Where(x => x.IsLiteral && !x.IsInitOnly) .Select(x => x.GetValue(null)).Cast<string>(); |
然后可以检查值是否包含以下内容:
1 | if(values.Contains("something")) {/**/} |
虽然可以循环使用反射(如其他答案所示)声明的常量,但这并不理想。
将它们存储在某种可枚举对象中会更有效率:数组、列表、数组列表,任何最适合您需求的对象。
类似:
1 2 3 | public class Parent { public static List<string> Children = new List<string> {"John","Mary","Jane"} } |
然后:
1 2 3 | if (Parent.Children.Contains(foo.Type) { //do something } |
可以使用反射获取给定类的所有常量:
1 2 3 4 5 6 7 | 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()); |