[英]Friendly Enum Strings With Flags Attribute
在仔細研究了一些其他有關在C#中通用創建對枚舉值的友好字符串訪問方式的常見問題之后, 此答案似乎是我對通用解決方案的最佳選擇,在通用解決方案中,可以使用DescriptionAttribute
將友好字符串放入枚舉的定義中。
我將其實現為擴展方法,但很快意識到,它僅適用於未指定[Flags]
屬性的標准枚舉。 對於屬性存在的情況,我不確定要實現此目標的最佳方法。
由於flags屬性意味着可以同時選擇多個值,因此使用單個“友好字符串”將毫無意義。 我正在考慮以相同的方式定義友好字符串,但是重載了擴展方法以采用特定的枚舉類型,該枚舉類型將返回List<string>
為所有選定值提供友好字符串。
上面描述的解決方案可以工作,但是我感覺會有很多代碼重復,因為每個使用Flags屬性的枚舉都將需要它自己的擴展方法,因為枚舉只能由System.Enum
繼承,從而消除了我創建基數的能力類型。 如果我可以有一個更通用的方法來處理此問題,那就更好了,該方法可以通過檢查是否存在flags屬性來枚舉枚舉,然后返回以下值之一:
object
dynamic
List<string>
我覺得這個問題可能是“也要吃蛋糕”的情況,因為我希望在獲取友好的字符串並刪除我的代碼后不必進行其他檢查。 有沒有技巧而不是雜亂無章的技巧?
您可以像在鏈接的答案中一樣編寫方法,但是支持標志枚舉,並返回逗號分隔的字符串,例如:
public static string GetDescription(Enum value)
{
Type type = value.GetType();
var values = Enum.GetValues(type);
var setValues = new List<Enum>();
foreach(var enumValue in values)
{
if (value.HasFlag((Enum)enumValue))
setValues.Add((Enum)enumValue);
}
var stringList = new List<string>();
foreach (var singleValue in setValues)
{
var name = Enum.GetName(type, singleValue);
if (name != null)
{
FieldInfo field = type.GetField(name);
if (field != null)
{
DescriptionAttribute attr =
Attribute.GetCustomAttribute(field,
typeof(DescriptionAttribute)) as DescriptionAttribute;
if (attr != null)
{
stringList.Add(attr.Description);
}
}
}
}
return string.Join(",", stringList.ToArray());
}
不是最干凈的代碼,但是您會明白,只是記住我的想法,即對於不是標記的枚舉,它將無法按預期工作-只是拋出一個想法。
使用enum.ToString()
獲得“不友好的”字符串(其中enum是您的Enum變量)。 編寫一個可重用的擴展方法,將UnfriendlyString轉換為友好的“ unfriendly string”(例如,在存在大寫或類似內容的地方插入空格小寫)。
對於[Flags]
您可以Split
不友好的字符串,轉換每個子字符串,也可以再次Join
; 否則您的擴展方法可能會將逗號考慮在內。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.