我的类中有一个属性,我可以将其设置为枚举值,该枚举具有标志属性。我想在我的 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 elements
上enumValue.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/