2017-06-15 31 views
0

我有一類叫做cConstsAndEnums內的枚舉:我應該如何轉換枚舉類型爲字符串在C#中

public class cConstsAndEnums 
{ 
    public enum EnSelectedKtovet 
    { 
     En_KtovetMaam = 1, 
     En_KtovetTmg 
    }; 
} 

在其他類我有開關:

switch (dr["rowSelectedKtovet"].ToString()) 
{ 
    case cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam: 
     doSomthing; 
     break; 
    default: 
} 

的問題是,我m出現錯誤: 無法將類型'cConstsAndEnums.EnSelectedKtovet'隱式轉換爲'string'。

我嘗試這樣做:

case (string)cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam: 

但我有錯誤: 無法轉換類型 'cConstsAndEnums.EnSelectedKtovet' 到 '串'。

也試過:

case Convert.ToString(cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam): 

但同樣我有錯誤: 恆定值預期。

請幫忙。

謝謝。

+1

'dr [「rowSelectedKtovet」]'是什麼類型? – Adrian

+1

[Enum to String]可能重複(https://stackoverflow.com/questions/483794/convert-enum-to-string) – Chawin

+0

@adjan,它是一個datarow類型,但這是好的,沒有錯誤它。 – shlomi

回答

2

原因是開關(字符串的數據類型)是你的情況下(枚舉值)不同。試圖通過使用.ToString()來解決這個問題意味着您正在進行一項操作,但是一個案例需要始終是一個常數值。以另一種方式做,將字符串投到枚舉,然後在交換機上使用它。

cConstsAndEnums.EnSelectedKtovet enumValue = (cConstsAndEnums.EnSelectedKtovet) 
    Enum.Parse(typeof(cConstsAndEnums.EnSelectedKtovet, dr["rowSelectedKtovet"].ToString()); 
switch (enumValue) 
{ 
    case cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam: 
    ... 
} 

還要考慮存儲枚舉的數值而不是字符串值。每種枚舉字面量,你可以簡單地轉換爲整數的值:

EnSelectedKtovet enumValue = EnSelectedKtovet.En_KtovetMaam; 
int storedEnumValue = (int)enumValue; 
EnSelectedKtovet restoredEnumValue = (EnSelectedKtovet)storedEnumValue; 

有了這個解決方案,您不需要處理任何字符串,這是更爲安全和舒適。

+0

也許我不清楚enougth,錯誤是大小寫的,不是在開關 – shlomi

+0

@shlomi錯誤是你使用'ToString ()'。你不需要它。該領域的類型是什麼?數字或字符串?爲什麼使用'ToString()'當你想再比較一個數字值就像枚舉? –

+0

@Fruchtzwerg謝謝,但我得到一個錯誤: 不能將類型對象隱式轉換爲cConstsAndEnums.EnSelectedKtovet。存在明確的轉換。 – shlomi

0

您應該使用Enum.Parse()方法(如果你確保字符串一直prvoded枚舉值),或Enum.TryParse()(在情況下,如果字符串cuold有什麼,所以你可以設置您枚舉默認值)

你的情況,試試這個:

var myEnum = (EnSelectedKtovet)Enum.Parse(typeof(EnSelectedKtovet), dr["rowSelectedKtovet"].ToString()); 

switch (myEnum) 
{ 
case EnSelectedKtovet.En_KtovetMaam: 
     doSomthing; 
     break; 
     default: 
} 
0

在你的switch語句,將其轉換爲枚舉

switch(Enum.Parse(typeof(EnSelectedKtovet), dr["rowSelectedKtovet"].ToString()){ 
    case cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam: 
    doSomthing; 
    break; 
    default: 
} 
0
switch ((EnSelectedKtovet)int.Parse(dr["rowSelectedKtovet"].ToString())) 
{ 
    case EnSelectedKtovet.En_KtovetMaam: 

     break; 

    default: 

     break; 
} 

我希望它會爲你工作。

0

這是XY Problem的一種情況。你問的是你試圖解決的問題,而不是實際的問題。

在這種情況下,實際的問題是您從數據庫讀取枚舉值。索引方法返回一個對象,所以你不能直接與其他任何東西進行比較。你必須轉換成它爲int(如果數據庫返回一個int)或一個字符串。你也可以直接將它強制轉換爲一個枚舉,因爲枚舉基本上被命名爲整數。

取而代之,您試圖將其轉換爲字符串。當您試圖將字符串與枚舉值進行比較時,您會看到一個編譯錯誤,因爲很顯然,枚舉不是一個字符串。

如果底層字段的值是一個整數,你可以將它轉換爲枚舉的類型:

var value=(cConstsAndEnums.EnSelectedKtovet)dr["rowSelectedKtovet"]; 
switch (value) 
{ 
    case cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam: 
     doSomthing; 
     break; 
    default: 
} 

如果它是一個包含枚舉名一個字符串,你將不得不解析字符串與Enum.ParseEnum.TryParse

var fieldValue=(string)dr["rowSelectedKtovet"]; 
var value=Enum.Parse(typeof(cConstsAndEnums.EnSelectedKtovet),fieldValue); 
switch (value) 
... 

帶着幾分C#7和模式匹配的魔法,你可以匹配這兩種情況下:

var value=dr["rowSelectedKtovet"]; 
switch(value) 
{ 
    case int val when Enum.IsDefined(typeof(cConstsAndEnums.EnSelectedKtovet),val) : 
     var enumValue=(cConstsAndEnums.EnSelectedKtovet)val; 
     //Use enumValue 
     break; 
    case string s when Enum.TryParse<cConstsAndEnums.EnSelectedKtovet>(s,out var enumValue): 
     //Use enumValue 
     break; 
    default : 
     throw new ArgumentException($"Unknown {value}"); 
} 
+0

我做了你的建議,但現在我得到開關(值)的錯誤: 開關表達式或案例標籤必須是布爾型,字符型,字符串型,枚舉型或對應的可空類型 – shlomi

+0

它是。所有片段使用實際的枚舉。只有模式匹配是不同的,但也可以用C#7編譯。你實際上*嘗試了什麼?數據庫返回的* actual *值是什麼? –

-1

你可以try.ToString(「D」)來與枚舉值進行比較。

string selectedValue= dr["rowSelectedKtovet"].ToString(); 
    if(selectedValue==cConstsAndEnums.EnSelectedKtovet.En_KtovetMaam.ToString("D")) 
     { 
     doSomthing(); 
     } 
+0

更好的是,根本不要轉換爲字符串。你輸入的內容只有在dr [「rowSelectedKtovet」]已經是一個整數或枚舉值 –