这是一个有点棘手的问题。也许有人的C#技能比我更强,因为我找不到解决方案。
我有一个方法,它接受一个参数,该参数包含枚举或指示枚举值的字符串,并返回该枚举的实例。它基本上是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
是 null,我会抛出一个异常。
然而,有时 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
}
我会得到这个错误:已经声明了具有相同签名的成员 因此,我只剩下一种选择:实现一个专门针对可空类型设计的完全独立的方法:
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?;
}
现在我可以这样调用:
MyEnum? foo = ParseNullable<T>(obj);
我的问题: 是否有一种方法可以将这两种方法合并成一个单独的方法,根据类型参数来正确处理,或者创建重载,其中一个重载用于 Nullable<> 类型参数的情况,另一个重载用于其他类型参数的情况?
Nullable<T>
版本重载该方法,因为你没有改变参数(因此不是重载);你只是改变了返回类型。 - pickypg