C# 从具有一个枚举属性的对象列表创建选择列表
我有一个类的对象列表,如:C# 从具有一个枚举属性的对象列表创建选择列表,c#,asp.net-mvc,enums,C#,Asp.net Mvc,Enums,我有一个类的对象列表,如: 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")]
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,
// .....
}
我有一个模板对象列表:
IEnumerable<Template> templateList = GetAllTemplates();
var templates=newlist();
var values=Enum.GetValues(typeof(TemplateTypeEnum));
foreach(值中的var值)
{
添加(新模板(){Name=Enum.GetName(typeof(TemplateTypeEnum),value),TemplateType=(TemplateTypeEnum)value,Id=(int)value});
}
稍后编辑:
对于检索属性名,它可能有助于回答一个类似的问题:“数据文本文件是枚举的字符串值”
这是不明确的,因此我假设您希望列表中的属性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.。您可以使用内置的方法 将
枚举
上的属性更改为使用:
视图模型:
public class Template
{
public TemplateTypeEnum? TemplateType { get; set; }
}
剃刀:
@Html.EnumDropDownListFor(x => x.TemplateType)
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");
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)