从具有一个枚举属性的对象列表中创建选择列表

时间:2018-01-12 14:36:16

标签: 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")]
    FirstItem = 1,
    [StringValue("Second item")]
    SecondItem = 2,
    // .....
 }

我有一个Template对象列表:

IEnumerable<Template> templateList = GetAllTemplates();

我想仅从Enum值填充选择列表,因此数据值字段是枚举值的int表示,而数据文本文件是枚举的字符串值,所以类似于:

 Model.TemplateList = new SelectList(templateList, "(int)TemplateType", "TemplateType.ToString()");

3 个答案:

答案 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)