一、前言
二、int值,string值轉換成enum
如下,乙個簡單列舉:
publicenum
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的**如下:
publicstatic 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轉換成列舉,同樣需要提供預設值來確保轉換結果的準確性,**如下:
publicstatic t tryparse(string typevalue, t defaultvalue, bool containstypename = false) where t : struct
}return toenum(typevalue, defaultvalue);
}
應用的話,比較簡單,exchangetype type = enumfieldprovider.tryparse("exchangetype.", exchangetype.all, true);
三、高階應用通用方式
publicstatic
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 作為關鍵技術落地的。其中有乙個功能叫...