【发布时间】:2020-09-21 21:28:43
【问题描述】:
我正在通过下面的代码将一个类的 Enum 转换为另一个类的 Enum:
var someClassA.MyEnumA = (MyEnumA)Enum.Parse(typeof(MyEnumA), someClassB.MyEnumA.ToString());
我发现自己经常重复这段代码,所以我写了一个如下的辅助方法:
public static T EnumFromString<T>(string value)
{
return (T)Enum.Parse(typeof(T), value);
}
那么上面同一行的用法是:
var someClassA.MyEnumA = EnumFromString<MyEnumA>(someClassB.MyEnumA.ToString());
这很好用。但是,我现在有了可以拥有可为空枚举的代码。所以我目前的代码是:
if (someClassB.MyEnumX.HasValue)
{
someClassA.MyEnumX = (MyEnumX)Enum.Parse(typeof(MyEnumX),someClassB.MyEnumX.ToString());
}
我不确定如何更新我当前的辅助方法来处理这两种情况 - 或者只编写另一个名为 NullableEnumFromString 的辅助方法会更简单 - 我不确定泛型如何工作甚至可能实现?
【问题讨论】:
-
我有点困惑。 SomeClassA 中的 MyEnumA 和 SomeClassB 中的 MyEnumA 属性是什么类型?
-
你不能在你的辅助方法中检查
value并在string.IsNullOrEmpty(value)返回null吗? -
要处理可以为空的枚举,您需要使用
<T?>类型和约束where T : struct -
另外(除了其他 cmets)你还必须从概念上弄清楚你想用 null 做什么?那个地图怎么样?您是要使用默认值,还是要指定默认值。
-
为什么不改用
someClassA.MyEnumX = someClassB.MyEnumX;?为什么需要通过字符串映射?