2016-11-12 28 views
5

而不是使用如下代碼所示的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; 
} 
+0

可以定義陣列中的全部通過數組常量和環路檢查常數值? – Peter

+0

您可以將所有常量值放入ArrayList中,在比較特定元素是否等於foo.Type時迭代列表。 – HaroldSer

+0

這可能有助於http://stackoverflow.com/questions/14971631/convert-an-enum-to-liststring,然後只是做一個** IndexOf(foo.Type)** –

回答

3

你可以找到所有的常量值等級:

var values = typeof(Parent.Child).GetFields(BindingFlags.Static | BindingFlags.Public) 
           .Where(x => x.IsLiteral && !x.IsInitOnly) 
           .Select(x => x.GetValue(null)).Cast<string>(); 

然後你就可以檢查是否值包含的東西:

if(values.Contains("something")) {/**/} 
1

雖然可以通過常量循環,聲明一樣,使用反射(如其他答案顯示),它的效果並不理想。

將它們存儲在某種可枚舉對象中會更有效率:一個數組,List,ArrayList,最適合您的任何需求。

喜歡的東西:

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

然後:

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

您可以使用反射來獲取給定類的所有常量:

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