我有一个类的对象列表,如:
public class Template
{
public TemplateTypeEnum TemplateType { get; set; }
public int Id { get; set; }
public int Name { get; set; }
/// etc...
}
并且枚举:
public enum TemplateTypeEnum
{
[StringValue("First item")]
FirstItem = 1,
[StringValue("Second item")]
SecondItem = 2,
// .....
}
我有一个Template对象列表:
IEnumerable<Template> templateList = GetAllTemplates();
我想仅从Enum值填充选择列表,因此数据值字段是枚举值的int表示,而数据文本文件是枚举的字符串值,所以类似于:
Model.TemplateList = new SelectList(templateList, "(int)TemplateType", "TemplateType.ToString()");
答案 0 :(得分:0)
var templates = new List<Template>();
var values = Enum.GetValues(typeof(TemplateTypeEnum));
foreach (var value in values)
{
templates.Add(new Template() { Name = Enum.GetName(typeof(TemplateTypeEnum), value), TemplateType = (TemplateTypeEnum)value, Id = (int)value });
}
稍后编辑:
对于检索属性名称,它可能有助于在类似问题上给出答案,例如:Getting attributes of Enum's value
答案 1 :(得分:0)
&#34;数据文本文件是枚举的字符串值&#34;
这是不明确的,所以我假设你想要列表中的属性 StringValue,而不是枚举值作为字符串的实际表示。
给出这样的扩展方法:
public static class AttributeExtensions {
public static TResult GetEnumAttributeValue<TEnum, TAttribute, TResult>(this TEnum value,
Func<TAttribute, TResult> valueFunc)
where TAttribute : Attribute
where TEnum : struct, IComparable, IFormattable {
var field = typeof(TEnum).GetField(value.ToString());
if (field == null) {
return default(TResult);
}
var attribute = field.GetCustomAttribute<TAttribute>();
if (attribute == null) {
return default(TResult);
}
return valueFunc.Invoke(attribute);
}
}
您可以检索列表的属性值:您必须通过创建一个包含可以作为字符串传递的属性的临时列表来使用SelectList构造函数来作弊:此示例假定您的StringValue
属性具有一个名为Value
var interimList = templateList.Select(t => new
{
Id = (int)t.TemplateType,
Value = t.TemplateType.GetEnumAttributeValue((StringValue) s) => s.Value);
});
Model.TemplateList = new SelectList(interimList, "Id", "Value");
(它还假设您可以使用匿名类型填充SelectList ..)
答案 2 :(得分:-1)
您可以使用内置 EnumDropDownListFor方法。
更改attribute
上的enum
以使用DisplayAttribute:
public enum TemplateTypeEnum
{
[Display(Name = "First item")]
FirstItem = 1,
[Display(Name = "Second item")]
SecondItem = 2
}
查看型号:
public class Template
{
public TemplateTypeEnum? TemplateType { get; set; }
}
剃刀:
@Html.EnumDropDownListFor(x => x.TemplateType)