这是一个棘手的问题。也许某人的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 .. –