2014-10-17 109 views
0

我可以這樣做嗎?它似乎並不如此。枚舉顯示名稱 - 使用變量?

public enum Options 
{ 
    [Display(Name = string.Format("{0} - {1}","Option One", MyClass.myVariable))] 
    OptionOne=1, 
    [Display(Name = string.Format("{0} - {1}","Option Two", MyClass.myVariable))] 
    OptionTwo=2 
} 

與此相反

public enum Options 
{ 
    [Display(Name = "Option 1")] 
    OptionOne=1, 
    [Display(Name = "Option 2")] 
    OptionTwo=2 
} 

如果沒有,我怎麼能做出的顯示名稱枚舉變量?

+2

你的意思是如何在enum中使用[attributes](http://stackoverflow.com/q/1799370/1997232)? – Sinatr 2014-10-17 12:18:44

+0

@Sinatr我猜想Display是一個屬性。更新的問題。 – 2014-10-17 12:20:12

+0

我不認爲你可以讓它們變化,它們需要在編譯時知道 – 2014-10-17 12:21:14

回答

3

好像沒人處理:

如果不是,我怎樣才能讓顯示名稱枚舉變量?

我能想到的某種枚舉映射和擴展的方法可能像這樣工作:

using System; 
using System.Collections.Generic; 
namespace ConsoleApplication1 
{ 
    public enum Foo 
    { 
     One = 1, 
     Two = 2, 
    } 

    public static class ExtensionMethods 
    { 
     private static readonly Dictionary<Enum, string> s_EnumMap = new Dictionary<Enum, string> 
      { 
       { Foo.One, string.Format("{0} - {1}","Option One", 1) }, 
       { Foo.Two, string.Format("{0} - {1}","Option Two", 2) } 
      }; 

     public static String ConvertToString(this Enum eff) 
     { 
      return s_EnumMap[eff]; 
     } 
    } 

    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      Console.WriteLine(Foo.One.ConvertToString()); 
      Console.WriteLine(Foo.Two.ConvertToString()); 
     } 
    } 
} 

整數12當然可以通過例如取代靜態變量,如MyClass.myVariable。如果這是您使用此代碼的方式,那麼請記住,s_EnumMap將存儲MyClass.myVariable變量在您首次使用ExtensionMethods類時(即MyClass的靜態字段得到初始化時)所具有的值。因此,修改代碼:

public MyClass 
{ 
    public static int myVariable = 5; 
} 

public static class ExtensionMethods 
{ 
    private static readonly Dictionary<Enum, string> s_EnumMap = new Dictionary<Enum, string> 
     { 
      { Foo.One, string.Format("{0} - {1}","Option One", MyClass.myVariable) }, 
      { Foo.Two, string.Format("{0} - {1}","Option Two", 2) } 
     }; 

    public static String ConvertToString(this Enum eff) 
    { 
     return s_EnumMap[eff]; 
    } 
} 

internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     Console.WriteLine(Foo.One.ConvertToString()); 
     Console.WriteLine(Foo.Two.ConvertToString()); 
     MyClass.myVariable = 100; 
     Console.WriteLine(Foo.One.ConvertToString()); 
     Console.WriteLine(Foo.Two.ConvertToString()); 
    } 
} 

會導致成:

方案一 - 5
方案二 - 2
方案一 - 5
方案二 - 2

雖然在註釋掉前兩個Console.WriteLine之後,輸出結果爲:

方案一 - 100
方案二 - 2

所以,如果你想dynamicaly那麼你必須實現某種邏輯更新s_EnumMap`反應的MyClass.myVariable變化,但只要我不不知道更多關於你想達到的目標,我無法提供更好的答案。

+0

棒極了。我可以用這個工作。謝謝。 – 2014-10-17 19:51:33

0

你想要什麼都做不到。編譯器需要在編譯時知道這個值。

0

簡短的回答沒有。 [Display ....]中的值只能在編譯時知道。例如。您可以定義文字,如字符串或枚舉值。 string.Format()在運行時被調用。如果可能的話,你應該用你的其他邏輯來調用它,使用你的枚舉。或者使用代碼生成,例如爲TT模板

1

您可以編寫一個單獨的方法來獲取顯示名稱,甚至可以編寫一個具有選項成員和顯示名稱成員的小類。我更喜歡Michal的想法,但是由於我已經開始寫這個,所以我想我會把它扔出去!

public enum Option 
{ 
    OptionOne = 1, 
    OptionTwo = 2 
} 

public static string GetOptionDisplayName(Option option) 
{ 
    switch (option) 
    { 
     case Option.OptionOne: 
      return string.Format("{0} - {1}", "Option One", MyClass.MyProperty); 
     case Option.OptionTwo: 
      return string.Format("{0} - {1}", "Option Two", MyClass.MyProperty); 
     default: 
      return option.ToString(); 
    } 
} 

public class AnotherOption 
{ 
    public Option Option { get; set; } 

    public string DisplayName 
    { 
     get { return GetOptionDisplayName(this.Option); } 
    } 
}