我已经为一些枚举值添加了一个自定义属性(为了给它们一个屏幕友好的字符串值)。我正在尝试构建一个用于MVC页面的SelectListItems列表,但是我在访问自定义属性时遇到了麻烦。
我的枚举看起来像这样。
public enum MyEnum
{
[StringValue("None")] None = 0,
[StringValue("First Value")] FirstValue = 1,
[StringValue("Second Value")] SecondValue = 2
}
该属性如下所示。
public class StringValueAttribute : Attribute
{
public StringValueAttribute(string value)
{
this.StringValue = value;
}
public string StringValue { get; protected set; }
}
我创建了一个帮助器类,以便我可以从Enum的实例轻松访问StringValue属性。
public static string GetStringValue(this Enum value)
{
Type type = value.GetType();
FieldInfo fieldInfo = type.GetField(value.ToString());
StringValueAttribute[] attribs = fieldInfo.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[];
return attribs != null && attribs.Length > 0 ? attribs[0].StringValue : null;
}
我可以这样称呼它。
MyEnum test = MyEnum.FirstValue;
string stringValue = test.GetStringValue();
最后,我坚持使用代码。我可以轻松地遍历Enum值,但这些值不是MyEnum的实例,因此我无法调用我的帮助函数。当我尝试访问FieldInfo时,它总是返回null。这是我到目前为止所拥有的。
public static List<SelectListItem> GetFlagsSelectList<T>(int? selectedValue)
{
List<SelectListItem> items = new List<SelectListItem>();
foreach (int value in Enum.GetValues(typeof(T)))
{
items.Add(new SelectListItem
{
Text = Enum.GetName(typeof(T), value),
Value = value.ToString(),
Selected = selectedValue.HasValue && selectedValue.Value == value
});
}
return items;
}
是否可以访问foreach循环中的自定义属性?
修改
我想我不清楚地问这个问题。我想访问foreach循环中的自定义属性。调用Enum.GetName(typeof(T),value)只返回我不想要的属性名称(例如FirstValue)。
我想做点什么:
foreach (int value in Enum.GetValues(typeof(T)))
{
string name = Enum.ToObject(typeof (T), value).GetStringValue();
}
但是T可以是任何类型,所以我不能在那里调用我的GetStringValue()方法。
我试过这样做:
foreach (int value in Enum.GetValues(typeof(T)))
{
FieldInfo fieldInfo = typeof(T).GetField(value.ToString());
StringValueAttribute[] attribs = fieldInfo.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[];
string name = attribs != null && attribs.Length > 0 ? attribs[0].StringValue : Enum.GetName(typeof(T), value),;
items.Add(new SelectListItem
{
Text = name,
Value = value.ToString(),
Selected = selectedValue.HasValue && selectedValue.Value == value
});
}
但我总是得到一个异常,因为FieldInfo对象总是返回null。
答案 0 :(得分:1)
尝试
static string GetStringValue2(Enum value) {
....
}
public static List<SelectListItem> GetFlagsSelectList<T>(int? selectedValue) where T : struct {
var items = new List<SelectListItem>();
foreach (T value in Enum.GetValues(typeof(T))) {
var stringValue = GetStringValue2((Enum)(object)value);
items.Add(new SelectListItem {
Text = Enum.GetName(typeof(T), value),
Value = Convert.ToInt32(value).ToString(),
Selected = selectedValue.HasValue && selectedValue.Value == Convert.ToInt32(value)
});
}
return items;
}
答案 1 :(得分:0)
我在前一段时间写了blog post(对于XmlEnumAttribute
,但这同样适用于此。)
public static string ConvertToString(Enum e)
{
// Get the Type of the enum
Type t = e.GetType();
// Get the FieldInfo for the member field with the enums name
FieldInfo info = t.GetField(e.ToString("G"));
// Check to see if the XmlEnumAttribute is defined on this field
if (!info.IsDefined(typeof(XmlEnumAttribute), false))
{
// If no XmlEnumAttribute then return the string version of the enum.
return e.ToString("G");
}
// Get the XmlEnumAttribute
object[] o = info.GetCustomAttributes(typeof(XmlEnumAttribute), false);
XmlEnumAttribute att = (XmlEnumAttribute)o[0];
return att.Name;
}
希望有所帮助。