枚举显示名称 - 使用变量?

时间:2014-10-17 12:16:23

标签: c# enums asp.net-mvc-5

我可以这样做吗?它似乎并非如此。

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
}

如果没有,我如何为枚举变量制作显示名称?

4 个答案:

答案 0 :(得分: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类时的值(即{{1}的静态字段时1}}被初始化了)。所以修改代码如下:

MyClass

会导致:

  

选项一 - 5
  选项二 - 2
  选项一 - 5
  选项二 - 2

在评论前两个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()); } } 之后,输出将是:

  

选项一 - 100
  选项二 - 2

因此,如果你想动态地对Console.WriteLine的变化做出反应,那么你必须实现一些逻辑来更新s_EnumMap`,但只要我不了解你想要实现的目标,我就不能提供更好的答案。

答案 1 :(得分: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); }
    }
}

答案 2 :(得分:0)

你想做什么是不可能做到的。编译器需要在编译时知道该值。

答案 3 :(得分:0)

简短的回答没有。 [Display ....]中的值只能在编译时知道。例如。您可以定义文字,如字符串或枚举值。 string.Format()在运行时被调用。如果可能的话,你应该用你的其他逻辑来调用它,使用你的枚举。或者使用代码生成,例如使用tt模板