2017-05-24 151 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