c# - 枚举标志从多个中获取显示名称

标签 c# asp.net-mvc enums

我的类中有一个属性,我可以将其设置为枚举值,该枚举具有标志属性。我想在我的 View 中显示枚举的显示名称,当我设置 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 elementsenumValue.GetType()

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

然后在 Razor View 中:

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

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

最佳答案

这是使用一些静态助手来实现此目的的一种方法:

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

关于c# - 枚举标志从多个中获取显示名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43964417/

相关文章:

c# - 无法访问 ViewModel 的属性

c# - 空 JSON 对象 ([{},{},..]) 被写入文件

c# - ASP.NET MVC 获取文本框输入值

c# - Azure Web应用程序Asp.NET Core 2错误: An error occurred while starting the application

asp.net-mvc - System.Web.Optimization和Microsoft.Web.Optimization不会在vs 2012中加载引用

c# - Enum 可以包含其他 Enum 吗?

swift - 如何在 Swift 中将 UIColor 用作枚举类型的 RawValue

c# - 在 C# 中创建 Websocket 服务器的最简单方法是什么?

c# - 尝试将托管代码中的字符串返回到 C++

haskell - 在 haskell 中将枚举转换为类似 int 的类型