枚举显示名称-使用变量



我能做到这一点吗?事实并非如此。

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
}

如果没有,我如何使枚举变量的显示名称?

似乎没有人在处理:

如果不是,如何为枚举变量设置显示名称

我可以考虑某种枚举映射加扩展方法,它可以像这样工作:

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将存储首次使用ExtensionMethods类时(即初始化MyClass的静态字段时)MyClass.myVariable变量的值。所以修改代码如下:

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

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

您可以编写一个单独的方法来获取显示名称,甚至可以编写一种具有选项成员和显示名称成员的小类。我更喜欢迈克尔的想法,但由于我已经开始写这篇文章了,我想我会把它扔掉!

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

你想要的无法实现。编译器需要在编译时知道该值。

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

最新更新