2017-05-14 89 views
0

我在我的類中有一個屬性,我可以將其設置爲一個枚舉值,該枚舉具有flag屬性。我想在我的視圖中顯示枚舉的顯示名稱,它在我將Person.Types設置爲單個值時起作用,但當它設置爲多個值時不起作用。Enum Flag獲取多個顯示名稱

[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視圖:

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

我有什麼期望從person.Types.GetDisplayName()的輸出「Lärare,學生「而不是」老師,學生「,我只從person.Types得到。 我正在使用.NET Core。

+0

http://stackoverflow.com/questions/13099834/how-to-get-the-display-name-attribute-of- an-enum-member-via-mvc-razor-code – Ashiquzzaman

+0

@Ashiquzzaman不僅僅只在你只有一個值時纔給出顯示名?如果您查看評論和我的帖子,我已經在使用關於該主題的推薦人推薦。 – Rob

回答

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