這是一個棘手的問題。也許某人的C#-fu比我的優越,因爲我找不到解決方案。有什麼辦法可以將這兩種方法合併爲一種方法或重載方法?
我有一個方法,它需要一個參數,該參數包含一個枚舉或一個指示枚舉值的字符串,並返回該枚舉的一個實例。它基本上是Enum.Parse
的實現,但作爲一種通用方法實現。爲什麼.NET Framework沒有內置的功能超出了我的想象。現在
public static T Parse<T>(object value) where T : struct
{
if (!typeof (T).IsEnum)
throw new ArgumentException("T must be an Enum type.");
if (value == null || value == DBNull.Value)
{
throw new ArgumentException("Cannot parse enum, value is null.");
}
if (value is String)
{
return (T)Enum.Parse(typeof(T), value.ToString());
}
return (T)Enum.ToObject(typeof(T), value);
}
,我可以這樣做:
MyEnum foo = Parse<MyEnum>(obj);
,並得到MyEnum
一個實例。如果obj
爲空,則會拋出異常。
但是,有時obj
是null
,我想這樣做。在這種情況下,我希望能夠做到:
MyEnum? foo = Parse<MyEnum?>(obj);
但是,對於我的生活,我不能想出一個辦法來獲取工作。首先,儘管Nullable<MyEnum>
是struct
,但它不能用作Parse<T>
的類型參數。我認爲這跟編譯器用Nullable<>
所做的所有魔法有關,所以我不會質疑它。
它沒有出現,你可以超載的方法,只區分它的基礎上約束T
。例如,如果我這樣做:
public static T Parse<T>(object value) where T : new()
{
// This should be called if I pass in a Nullable, in theory
}
我會得到錯誤:成員具有相同簽名已經宣佈
所以,這給我留下了只剩下一個方法:實現一個完全獨立的方法設計爲可空類型:
MyEnum? foo = ParseNullable<T>(obj);
:
public static T? ParseNullable<T>(object value) where T : struct
{
if (!typeof (T).IsEnum)
throw new ArgumentException("T must be an Enum type.");
if (value == null || value == DBNull.Value)
return null;
if (value is String)
return Enum.Parse(typeof (T), value.ToString()) as T?;
return Enum.ToObject(typeof (T), value) as T?;
}
現在我可以把這個
我的問題:有沒有辦法將這兩種方法結合成一種方法,根據類型參數做對,或者創建一個重載,其中一個重載將用於類型參數是可空的<>而另一個超載在不是時調用?
你將無法ov使用'Nullable'版本來加載該方法,因爲您沒有更改參數(因此不會重載)。你只是改變返回類型。 –
pickypg
@pickypg - 是的,這是我的問題;我希望編譯器可以重載基於泛型類型約束的方法..也許C#6 heh .. –