【问题标题】:Creating a select list from an list of objects that have one enum property [duplicate]从具有一个枚举属性的对象列表中创建选择列表[重复]
【发布时间】:2018-01-12 14:36:15
【问题描述】:

我有一个类的对象列表,例如:

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();

我想只从枚举值中填充一个选择列表,以便数据值字段是枚举值的 int 表示,而数据文本文件是枚举的字符串值,所以类似于:

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

【问题讨论】:

    标签: c# asp.net-mvc enums


    【解决方案1】:
    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

    【讨论】:

      【解决方案2】:

      "数据文本文件是枚举的字符串值"

      这是不明确的,所以我假设您想要列表中的 属性 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..)

      【讨论】:

        【解决方案3】:

        您可以使用内置 EnumDropDownListFor 方法。

        enum 上的attribute 更改为使用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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-31
          • 2014-10-17
          • 2011-01-08
          • 1970-01-01
          相关资源
          最近更新 更多