我创建了一个小应用程序,我现在正在为每个页面上的常量定义特定于文化的文本。我一直在使用一些Enum DropDownLists,并且已经为每个Enum值使用Display(Name="Something")
属性来显示字符串名称。
现在我正在使用资源文件来确定基于文化的文本,我必须将属性值更改为[Display(Name="SomeResourceValue", ResourceType=typeof(Resources.Resources))]
我遇到的问题是我有一个静态方法,它接受字符串DisplayName
并返回Enum值(提供Enum类型),由于引入资源文件现在不起作用
我正在努力改进的方法如下:
//Converts Enum DisplayName attribute text to it's Enum value
public static T GetEnumDisplayNameValue<T>(this string name)
{
var type = typeof(T);
if (!type.IsEnum)
throw new ArgumentException();
FieldInfo[] fields = type.GetFields();
var field = fields
.SelectMany(f => f.GetCustomAttributes(
typeof(DisplayAttribute), false), (
f, a) => new { Field = f, Att = a }).SingleOrDefault(a => ((DisplayAttribute)a.Att)
.Name == name);
return field == null ? default(T) : (T)field.Field.GetRawConstantValue();
}
如果有人可以帮我改进,以便进行资源查找,我将非常感激。
答案 0 :(得分:0)
工作解决方案如下:
public static T GetEnumDisplayNameValue<T>(this string name, CultureInfo culture)
{
var type = typeof(T);
if (!type.IsEnum)
throw new ArgumentException();
FieldInfo[] fields = type.GetFields();
var field = fields.SelectMany(f => f.GetCustomAttributes(typeof(DisplayAttribute), false),
(f, a) => new { Field = f, Att = a })
.SingleOrDefault(a => Resources.ResourceManager.GetString(((DisplayAttribute)a.Att).Name, culture) == name);
return field == null ? default(T) : (T)field.Field.GetRawConstantValue();
}