我可以这样做吗?它似乎并非如此。
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
}
如果没有,我如何为枚举变量制作显示名称?
答案 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());
}
}
}
整数1
和2
当然可以替换为例如静态变量,例如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模板