2012-08-02 201 views
3

所以我有這個開關,以設置等待時間傳遞枚舉命令行參數

public int Option(string arg) 
{ 
    switch (arg) 
    { 
     case "/t:Max": 
       return 0; 
     case "/t:Med": 
       return 1000; 
     case "/t:Min": 
       return 2000; 
     default: return 0; 
    } 
} 

如何使用枚舉爲/噸:民/噸:地中海,/t.Max以更換開關?

確實是這樣的:

enum t 
{ 
    /t:Min, 
    /t:Med, 
    /t:Max 
}; 
+2

Enum.TryParse()浮現在腦海...... – 2012-08-02 13:36:15

+1

@JamesMichaelHare:雖然它用一個枚舉替換了字符串,但它不會消除對該開關的需要。除非數字是在enum常量中編碼的,我可能會稱其爲hack :-) – 2012-08-02 13:37:30

+0

您將不得不失去/ t:部分。 – hatchet 2012-08-02 13:38:09

回答

3

你的枚舉應該是這樣的:

public enum WaitTime 
{ 
    Min, Max, Med 
} 

和交換機轉換爲這樣的:

switch ((WaitTime)Enum.Parse(typeof(WaitTime), arg.Replace("/:", string.Empty))) 
{ 
    case WaitTime.Max: 
      return 0; 
    case WaitTime.Med: 
      return 1000; 
    case WaitTime.Min: 
      return 2000; 
    default: 
      return 0; 
} 
+0

@abatishchev謝謝;) – 2012-08-03 09:35:58

0

代碼:

enum YourEnum 
{ 
    Min, 
    Med, 
    Max 
}; 

void Main(string[] args) 
{ 
    var arg0 = args[0]; // "/t:Min" 
    var arg0arr = arg0.Split(':') // { "/t", "Min" } 
    var arg0val = arg0arr[1]; // "Min" 
    var e = Enum.Parse(typeof(YourEnum), arg0val); 
} 

呼叫應用:

app.exe /t:Min 
0

糾正我,如果我錯了,但不是最簡單的方法只是使用arg作爲鍵和時間作爲值的字典,並使用.TryGetValue(),如果失敗只是返回0?

像這樣: arguments.Add可能在構造函數中發生,dosn't不需要在方法中。

private static Dictionary<string, int> arguments = new Dictionary<string, int>(5); 

    public int Option(string arg) 
    { 
     arguments.Add("Max", 0); 
     arguments.Add("Med", 1000); 
     arguments.Add("Min", 2000); 

     int value; 
     if (arguments.TryGetValue(arg.Replace("/:", string.Empty), out value)) 
      return value; 
     //default 
     return 0; 
    } 
1

試試這個:

public enum t 
{ 
    [Description("/t:Min")] // <<---- set the string equivalent of the enum HERE. 
    min = 0, // <<---- set the return value of the enum HERE. 

    [Description("/t:Med")] 
    med = 1000, 

    [Description("/t:Max")] 
    max = 2000 
} 

您還需要這個方便的小類:

public static class EnumHelper 
{ 
    public static list_of_t = Enum.GetValues(typeof(t)).Cast<t>().ToList(); 

    // returns the string description of the enum. 
    public static string GetEnumDescription(this Enum value) 
    { 
     FieldInfo fi = value.GetType().GetField(value.ToString()); 

     DescriptionAttribute[] attributes = 
      (DescriptionAttribute[])fi.GetCustomAttributes(
      typeof(DescriptionAttribute), 
      false); 

     if (attributes.Length > 0) 
      return attributes[0].Description; 
     else 
      return value.ToString(); 
    } 
} 

您可以使用裝飾枚舉這樣得到你需要的東西:

public int Option(string arg) 
{ 
    // get the matching enum for the "/t:" switch here. 
    var foundItem = 
     EnumHelper.list_of_t.SingleOrDefault(c => c.GetEnumDescription() == arg); 

    if (foundItem != null) 
    { 
    return (int)foundItem; // <<-- this will return 0, 1000, or 2000 in this example. 
    } 
    else 
    { 
    return 0; 
    } 
} 

HTH ...