枚举标记从多个

时间:2017-05-14 13:26:15

标签: c# asp.net-mvc enums

我的类中有一个属性,我可以设置为枚举值,枚举有flag属性。我想在我的视图中显示枚举的显示名称,当我将Person.Types设置为单个值但不将其设置为多个值时,它会起作用。

[Flags]
public enum TypesEnum
{
    [Display(Name = "Lärare")]
    Teacher = 1,
    [Display(Name = "Student")]
    Student = 2
}

public class Person
{
    public string Name { get; set; }
    public TypesEnum Types { get; set; }
}

person.Types = TypesEnum.Teacher | TypesEnum.Student;

var model = db.Persons
            .Where(x => x.Types.HasFlag(TypesEnum.Teacher))
            .ToList();

当这个人只有一个类型时,我使用了这个帮助器方法来获取DisplayNameAttribute。但是当这个人有两个人(例如老师和学生)时,我会在InvalidOperationException: Sequence contains no elements上得到enumValue.GetType()

public static string GetDisplayName(this Enum enumValue)
{
    return enumValue.GetType()
                    .GetMember(enumValue.ToString())
                    .First()
                    .GetCustomAttribute<DisplayAttribute>()
                    .GetName();
}

然后在剃刀视图中:

@foreach (var person in Model)
{
    <h3>@person.Name<h3>
    <p>@person.Types</p>
}

我期望person.Types.GetDisplayName()的输出是“Lärare,学生”,而不是“老师,学生”,因为我从person.Types获得。 我正在使用.NET Core。

1 个答案:

答案 0 :(得分:0)

以下是使用一些静态帮助程序的一种方法:

    /// <summary>
    /// Gets the display name for an enum.
    /// </summary>
    /// <param name="enumValue"></param>
    /// <exception cref="ArgumentException"></exception>
    /// <returns></returns>
    public static string GetDisplayName(this Enum enumValue)
    {
        var enumType = enumValue.GetType();
        var names = new List<string>();
        foreach (var e in Enum.GetValues(enumType))
        {
            var flag = (Enum)e;              
            if(enumValue.HasFlag(flag))
            {
                names.Add(GetSingleDisplayName(flag));
            }
        }
        if (names.Count <= 0) throw new ArgumentException();
        if (names.Count == 1) return names.First();
        return string.Join(",", names);
    }

    /// <summary>
    /// Gets the display value for a single enum flag or 
    /// name of that flag if the display value is not set
    /// </summary>
    /// <param name="flag"></param>
    /// <returns></returns>
    public static string GetSingleDisplayName(this Enum flag)
    {
        try
        {
            return flag.GetType()
                    .GetMember(flag.ToString())
                    .First()
                    .GetCustomAttribute<DisplayAttribute>()
                    .Name;
        }
        catch
        {
            return flag.ToString();
        }
    }