关于c#:如何遍历静态类常量?

How to loop through a static class of constants?

除了使用下面代码中所示的switch语句之外,是否还有其他方法来检查foo.Type是否与Parent.Child类中的任何常量匹配?

预期目标是循环遍历所有常量值,以查看foo.Type是否匹配,而不必将每个常量指定为case

父类:

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());