我想在我的Apex代码中使用Enum值,因为我们在使用外部服务时有一些严格的类型,但是当我从外部服务获得响应时,我正在努力将Enum值的字符串表示转换回来到Enum所以它可以在我的代码中使用。
要在C#中执行此操作,我会这样做:
DayOfWeek wednesday =
(DayOfWeek)Enum.Parse(typeof(DayOfWeek), "Wednesday");
但在Apex代码中我找不到办法做到这一点。有人有解决方案吗?
答案 0 :(得分:7)
这不是通用的,但它可行:
String dayOfWeekNameToMatch = 'Wednesday';
DayOfWeek dayOfWeekMatch;
for (DayOfWeek dow: DayOfWeek.values()) {
if (dow.name() == dayOfWeekNameToMatch) {
dayOfWeekMatch = dow;
break;
}
}
答案 1 :(得分:1)
针对任何枚举执行此操作的“通用”方法:
public static Object parseEnum(string enumString, Type enumType) {
Type cType = Type.forName(String.format('List<{0}>', new List<String>{ enumType.getName() }));
return ((List<Object>) JSON.deserialize(String.format('["{0}"]', new List<String>{ enumString }), cType))[0];
}
调用它有点尴尬,但是比其他解决方案(IMO)更好:
TriggerOperation operationType = (TriggerOperation)
parseEnum('before_delete', TriggerOperation.class);
System.debug(operationType); // -> BEFORE_DELETE
一定要爱顶点:)
答案 2 :(得分:0)
如果您有多个要转换为枚举的String值,并且不想每次都在枚举上进行迭代,则可以使用延迟初始化来定义特殊的映射:
public static Map<String, DayOfWeek> dayOfWeekByNames {
get {
if (dayOfWeekByNames == null) {
dayOfWeekByNames = new Map<String, DayOfWeek>();
for (DayOfWeek dayOfWeek : DayOfWeek.values()) {
dayOfWeekByNames.put(dayOfWeek.name(), dayOfWeek);
}
}
return dayOfWeekByNames;
}
private set;
}
接下来只需使用此地图进行投射:
DayOfWeek dayOfWeek = dayOfWeekByNames.get('Monday');