2014-10-17 73 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); } 
    } 
}