Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从具有一个枚举属性的对象列表创建选择列表_C#_Asp.net Mvc_Enums - Fatal编程技术网

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)