2017-05-24 149 views
0

是否有一种快速查找枚举的方法,仅使用枚举的标签而不是值。假设Enum类型是SalesStatus,我希望基本能够调用某种类型的函数,如enumLabel2Value(enumStr(SalesStatus),“Open order”),它将返回1.通过标签而不是按值查找枚举

我试图避免循环遍历所有可能的值并单独检查每个值,似乎这应该是可用的,因为每当用户筛选网格上的枚举列时,它们都输入到标签中,而不是值,但是我没有看到任何像它。

回答

2

您可以使用str2Enum函数。从文档:

检索枚举元素,其局部 输入字符串匹配标签属性值。

除了从亚历克斯Kwitny的答案的告诫,我建议您看看文件的意见,特别是评论

请注意,str2Enum执行部分匹配和 开始匹配字符串。如果有多个匹配,则需要 第一个匹配。

另外看看类DMFEntityBase的方法string2Enum,它支持不同的选项如何指定enum元素。我认为用DictEnum.name2Value()方法处理由它们的标签指定的枚举元素。在评论亚历克斯Kwitny的答复中提到

更新

OP,这是一个特定的枚举ExchangeRateDisplayFactor他有问题与。 str2Enum还与该枚举,如下面的工作表明:

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' 
} 
+0

很好的答案。我在前面没有AX,只是在想如何有效的功能不可能存在,比3或4线循环更好。 –

3

它不存在,因为标签可以是各种不同语言的东西。 symbol2Value()虽然存在,可能是你正在寻找,但你的问题是专门在标签上。在哪里,这可能是非常糟糕的例子...

比方说,你有一个名为GoodBadPresent,以指示什么类型的圣诞介绍,您将收到一个枚举,有两个值:

  1. GoodBadPresent::Poison英文标签: “毒”;德国标签:“礼品
  2. GoodBadPresent::Gift英文标签:“礼品”;德语标签:“Geschenk”

如果此示例不明确,则德语中的Poison的字词为Gift。因此,如果您尝试将Gift解析为枚举值,则还需要提供该语言。这里的性能问题可能比通过枚举循环的性能问题更大。

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

我更好奇,您的方案,你需要回到从标签枚举的细节。

+0

具体来说,我正在开发一个解决货币汇率提供者添加自定义的系统和领域之一的CSV被发送给我们文件是报价单位,它与枚举ExchangeRateDisplayFactor相关。 CSV文件将给出值为1,10,100,1000或10000,这与每个枚举的标签完全匹配。如果这种情况下的标签不是全部数字,FH的答案似乎会奏效。 – codemann8

+0

我明白了。您应该创建自己的EDT,以匹配“ExchangeRateDisplayFactor”的枚举值,例如“MyExchangeRateDisplayFactor”,然后使用基本分配“ExchangeRateDisplayFactor = MyExchangeRateDisplayFactor”来转换或一百万个其他选项。或者你可以创建一个配置表,你设置'1' ='ExchangeRateDisplayFactor :: One'等。 –

+0

是的,我希望避免if(value ==“1”)返回Enum :: FactorOne; if(value ==“10”)返回Enum :: FactorTen;等等或循环通过DictEnum。创建一个新的枚举不能解决问题,10000不是一个有效的值。有一个更简单的方法,AX与用户通过网格筛选时使用的机制相同... – codemann8