我的类中有一个属性,我可以设置为枚举值,枚举有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。
答案 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();
}
}