枚举显示名称-使用变量
本文关键字:变量 显示 枚举 | 更新日期: 2023-09-27 18:27:02
我能做到这一点吗?事实并非如此。
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());
}
}
}
整数1
和2
当然可以由例如静态变量(例如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模板