【问题标题】:How to loop through a static class of constants?如何循环一个静态类的常量?
【发布时间】:2016-11-12 01:39:41
【问题描述】:

除了使用如下代码所示的 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;
}

【问题讨论】:

  • 你能定义一个数组中的所有常量,然后循环遍历这个数组来检查常量值吗?
  • 您可以将所有常量值放在一个 ArrayList 中,在比较特定元素是否等于 foo.Type 时迭代列表。
  • 这可能会帮助stackoverflow.com/questions/14971631/…,然后只需执行 IndexOf(foo.Type)

标签: c# asp.net loops


【解决方案1】:

使用Reflection可以找到类中的所有常量值:

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")) {/**/}

【讨论】:

    【解决方案2】:

    虽然您可以循环使用反射声明的常量(如其他答案所示),但这并不理想。

    将它们存储在某种可枚举的对象中会更有效率:数组、List、ArrayList,只要最符合您的要求。

    类似:

    public class Parent {
        public static List<string> Children = new List<string> {"John", "Mary", "Jane"}
    }
    

    然后:

    if (Parent.Children.Contains(foo.Type) {
        //do something
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用反射来获取给定类的所有常量:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-28
        • 1970-01-01
        • 1970-01-01
        • 2014-12-25
        • 2012-04-17
        • 2014-02-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多