按标签而不是按值查找枚举

Look up Enum by label instead of by value

有没有一种快速查找枚举的方法,只使用枚举的标签而不是值。假设 Enum 类型是 SalesStatus,我希望能够基本上调用某种函数,例如 enumLabel2Value(enumStr(SalesStatus), "Open order") 并且它将 return 1.

我试图避免遍历所有可能的值并分别检查每个值,这似乎应该是现成的东西,因为每当用户在网格上的枚举列上进行过滤时,他们都会在标签中输入,不是价值,但我还没有看到类似的东西。

它不存在,因为标签可以是不同语言的各种东西。 symbol2Value() 虽然存在并且可能是您要查找的内容,但您的问题专门针对标签。这可能非常糟糕的一个例子......

假设您有一个名为 GoodBadPresent 的枚举,用于指示您将收到哪种类型的圣诞礼物,它有两个值:

  1. GoodBadPresent::Poison英文标签:"Poison";德国标签:“礼物
  2. GoodBadPresent::Gift英文标签:“Gift”;德国标签:"Geschenk"

如果这个例子不清楚,德语中 Poison 的单词是 Gift。因此,如果您尝试将 Gift 解析为枚举值,您还必须提供语言。这里的性能问题可能比循环枚举的性能问题更大。

您可以查看DictEnum,看看是否有任何方法可以帮助您更简洁地实现您想要的。 https://msdn.microsoft.com/en-us/library/gg837824.aspx

我对您需要从标签返回到枚举的场景的细节更好奇。

您可以为此使用 str2Enum 函数。来自文档:

Retrieves the enum element whose localized Label property value matches the input string.

除了 Alex Kwitny 的回答中的警告之外,我还建议您查看文档的评论,特别是评论

Please note that str2Enum performs partial matching and matches the beginning of the string. If there are multiple matches, it will take the first one.

此外,请查看 class DMFEntityBase 的方法 string2Enum,它支持如何指定枚举元素的不同选项。我认为使用 DictEnum.name2Value() 方法处理由标签指定的枚举元素。

更新

OP 在对 Alex Kwitny 的回答的评论中提到,这是他遇到问题的特定枚举 ExchangeRateDisplayFactorstr2Enum 也适用于该枚举,如以下作业所示:

static void str2EnumTest(Args _args)
{
    ExchangeRateDisplayFactor factor;

    factor = str2Enum(factor, '1');
    info(strFmt('%1', factor)); // outputs '1'
    factor = str2Enum(factor, '10');
    info(strFmt('%1', factor)); // outputs '10'
    factor = str2Enum(factor, '100');
    info(strFmt('%1', factor)); // outputs '100'
    factor = str2Enum(factor, '1000');
    info(strFmt('%1', factor)); // outputs '1000'
    factor = str2Enum(factor, '10000');
    info(strFmt('%1', factor)); // outputs '10000'
}