Enum是如何用的?

2022-01-20 12:54:45 字數 3545 閱讀 9768

一、前言

二、int值,string值轉換成enum

如下,乙個簡單列舉:

public

enum

exchangetype

對於以下輸入**:

exchangetype type = (exchangetype)3

;

if (type ==exchangetype.all)

else

if (type ==exchangetype.szse)

else

對於強制轉換,大家猜猜看,會輸出什麼....

對於結果,大家可以自己去測試下,有可能與你期望的值不一致!

同樣對於以下**:

exchangetype type;

bool success = enum.tryparse("

3", out type);

tryparse執行的返回結果success也是成功的(為true),但期望值也不一定正確。

因此,對於列舉轉換來說,還是很容易出錯的。所以,必須提供預設的值來確保轉換失敗時,返回正確的值。對於int值和string值轉換成enum的**如下:

public

static t toenum(int value, t defaultt) where t : struct

public

static t toenum(string enumname, t defaultt) where t : struct

t result;

if (!enum.tryparse(enumname.trim(), out

result))

if (enum.isdefined(typeof

(t), result))

return

defaultt;

}

另外還提供了其他應用的方法,如將包含型別名稱字首的字串exchangetype.all轉換成列舉,同樣需要提供預設值來確保轉換結果的準確性,**如下:

public

static t tryparse(string typevalue, t defaultvalue, bool containstypename = false) where t : struct

}return toenum(typevalue, defaultvalue);

}

應用的話,比較簡單,exchangetype type = enumfieldprovider.tryparse("exchangetype.", exchangetype.all, true);

三、高階應用通用方式

public

static

enumfieldattribute getenumattribute(type type)

object customattributes = type.getcustomattributes(typeof(enumfieldattribute), true

); enumfieldattribute attribute = null

;

foreach (object attr in

customattributes)

}return

null

; }

public

static ilist> getitems(bool isspecialrequired = false) where t : struct

var enumitems = new list>();

enumfieldattribute attribute = null

; t currentvalue;

foreach (var field in

fields)

}currentvalue = (t)field.getvalue(null

); enumitems.add(

new enumitem(currentvalue, attribute.desc));}}

}return

enumitems;

}public

static ilist> getitems(ilistentities) where t : struct

var enumitems = new list>();

foreach (var entity in

entities)

return

enumitems;

}public

static

string getitemdescription(t enumitem) where t : struct

object customattributes = field.getcustomattributes(typeof(enumfieldattribute), true

);

foreach (object attr in

customattributes)

}return

string

.empty;

}public

static enumitemgetitem(t enumitem) where t : struct

object customattributes = field.getcustomattributes(typeof(enumfieldattribute), true

);

foreach (object attr in

customattributes)

}return

new enumitem(enumitem, enumitem.tostring());

}

對於方法public static ilist> getitems(bool isspecialrequired = false) where t : struct,提供乙個引數來篩選是否需要該引數,如以上定義的列舉型別exchangetype中的 enumfieldattribute("不限", true),其中enumfieldattribute("不限", true)第二個引數與isspecialrequired引數一致。

測試**如下:

[testmethod()]

public

void

getitemstest()

[testmethod()]

public

void

getitemswithfalseargtest()

四、總結

對於細節方面,還是需要花時間和精力來總結的。用得多了,自然也就懂了,洗洗睡覺了...

今天又是7月1號,又是乙個紀念日。4年前,6月26號畢業聯歡晚會後,哥開始正式工作的第一天也是7月1號。一轉眼,4年過去了,人生如戲...

我是如何用Worktile進行敏捷開發的

產品backlog是scrum的核心,也是一切的起源。從根本上說,它就是乙個需求 或故事 或特性等組成的列表,按照重要性的級別進行了排序。它裡面包含的是客戶想要的東西,並用客戶的術語加以描述。一般來說產品backlog需要包含以下幾個重要的屬性 這時候worktile的優勢就體現出來了 workti...

python裝逼 我是如何用python裝逼失敗的

題記 在乙個拿著錘子的人眼裡,所有的東西都是釘子。如果老師要製作詞卡讓學生去背詞,有很多好用的工具。比如quizlet,tinycards,anki等等。我用的就是quizlet。quizlet 相當贊的背詞工具 但詞表是本地檔案,如果要乙個乙個填到詞卡里,非常浪費時間。所以quizlet有個功能支...

我是如何用 redis 做實時訂閱推送的

小hub領讀 20w 的推送使用者,如何做到秒級併發完成,文中分別介紹了mq 傳統定時任務以及redis的sortset佇列三種方案,一一分析可行性,並且最後給出了redis的邏輯與部分 實現。你學會了嗎?前陣子開發了公司領劵中心的專案,這個專案是以 redis 作為關鍵技術落地的。其中有乙個功能叫...