創(chuàng)建將T約束為Enum的泛型方法我正在構(gòu)建一個(gè)函數(shù)來(lái)擴(kuò)展Enum.Parse概念允許在找不到Enum值時(shí)解析默認(rèn)值不區(qū)分大小寫(xiě)所以我寫(xiě)了如下:public static T GetEnumFromString<T>(string value, T defaultValue) where T : Enum{
if (string.IsNullOrEmpty(value)) return defaultValue;
foreach (T item in Enum.GetValues(typeof(T)))
{
if (item.ToString().ToLower().Equals(value.Trim().ToLower())) return item;
}
return defaultValue;}我得到的錯(cuò)誤約束不能是特殊類(lèi)System.Enum.很公平,但是否存在允許泛型Enum的解決方案,或者我將不得不模仿Parse函數(shù)并將一個(gè)類(lèi)型作為屬性傳遞,這會(huì)將丑陋的裝箱要求強(qiáng)制到您的代碼中。編輯下面的所有建議都非常感謝,謝謝。已經(jīng)決定了(為了保持大小寫(xiě)不敏感,我留下了循環(huán)-我在解析XML時(shí)使用了這個(gè))public static class EnumUtils{
public static T ParseEnum<T>(string value, T defaultValue) where T : struct, IConvertible
{
if (!typeof(T).IsEnum) throw new ArgumentException("T must be an enumerated type");
if (string.IsNullOrEmpty(value)) return defaultValue;
foreach (T item in Enum.GetValues(typeof(T)))
{
if (item.ToString().ToLower().Equals(value.Trim().ToLower())) return item;
}
return defaultValue;
}}編輯:Julien Lebosquain最近發(fā)布了編譯器強(qiáng)制使用msil或F#中的類(lèi)型安全泛型解決方案。下面,這很值得一看,并且值得一看。我將刪除此編輯,如果解決方案氣泡更高的頁(yè)面。
3 回答

炎炎設(shè)計(jì)
TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個(gè)贊
Enum
IConvertible
public T GetEnumFromString<T>(string value) where T : struct, IConvertible{ if (!typeof(T).IsEnum) { throw new ArgumentException("T must be an enumerated type"); } //...}
IConvertible
- 3 回答
- 0 關(guān)注
- 1612 瀏覽
添加回答
舉報(bào)
0/150
提交
取消