如何解析字符串并在Apex代码中返回枚举值?

时间:2012-03-23 11:41:22

标签: salesforce apex-code

我想在我的Apex代码中使用Enum值,因为我们在使用外部服务时有一些严格的类型,但是当我从外部服务获得响应时,我正在努力将Enum值的字符串表示转换回来到Enum所以它可以在我的代码中使用。

要在C#中执行此操作,我会这样做:

DayOfWeek wednesday = 
      (DayOfWeek)Enum.Parse(typeof(DayOfWeek), "Wednesday");

但在Apex代码中我找不到办法做到这一点。有人有解决方案吗?

3 个答案:

答案 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');