2014-01-23 163 views
0

enter image description here轉換成字符串枚舉

我工作的WCF服務,並希望返回首選項鍵的枚舉,而不是字符串。

如何使最優化方式中的字符串類型preferencekey列的枚舉?

+0

我不能改變數據庫結構。 – Rohit

回答

2

羅希特,

preferenceKey的數值不能很容易地轉換到一個枚舉如你所願。可以使用Enum.Parse()方法分析字符串,但枚舉名稱必須與數據庫中的不同。這些問題是

  1. 你的字符串以數字開頭
  2. 你的字符串包含-字符

現在這樣說,你可以設計出不同的方法來枚舉的您的命名convetion作爲一個例子(我個人不喜歡這個例子,但可能會工作)。

首先定義一個名爲EnumName這個屬性將用於與您從數據庫中預期的名稱來裝飾你的枚舉的新屬性。如

[AttributeUsage(AttributeTargets.Field, AllowMultiple = true)] 
public sealed class EnumNameAttribute : Attribute 
{ 
    readonly string name; 

    public EnumNameAttribute(string name) 
    { 
     this.name = name; 
    } 

    public string Name { get { return this.name; } } 
} 

下一步將是確定您的枚舉(什麼我不喜歡的是名字)

public enum Preferences 
{ 
    [EnumName("6E-SF-TYPE")] 
    SIX_E_SF_TYPE = 0, 
    [EnumName("6E-SF-VALUE")] 
    SIX_E_SF_VALUE = 1 
} 

夠簡單,我們有我們的枚舉與飾有EnumName屬性的每個項目。下一步將創建一個基於數據庫字符串解析枚舉的方法。

public static class EnumNameParser 
{ 
    public static Preferences ParseString(string enumString) 
    { 
     var members = typeof(Preferences).GetMembers() 
              .Where(x => x.GetCustomAttributes(typeof(EnumNameAttribute), false).Length > 0) 
              .Select(x => 
               new 
               { 
                Member = x, 
                Attribute = x.GetCustomAttributes(typeof(EnumNameAttribute), false)[0] as EnumNameAttribute 
               }); 

     foreach(var item in members) 
     { 
      if (item.Attribute.Name.Equals(enumString)) 
       return (Preferences)Enum.Parse(typeof(Preferences), item.Member.Name); 
     } 

     throw new Exception("Enum member " + enumString + " was not found."); 
    } 
} 

此方法只需要一個輸入流,評估所有的EnumNameAttributes並返回第一匹配(或異常,如果未找到)。

那麼這可以被稱爲如。

string enumString = "6E-SF-TYPE"; 
var e = EnumNameParser.ParseString(enumString); 

現在,如果你想利用枚舉和數據庫中獲取的名稱,你可以用

public static string GetEnumName(this Preferences preferences) 
{ 
    var memInfo = typeof(Preferences).GetMember(preferences.ToString()); 
    if (memInfo != null && memInfo.Length > 0) 
    { 
     object[] attrs = memInfo[0].GetCustomAttributes(typeof(EnumNameAttribute), false); 
     if (attrs != null && attrs.Length > 0) 
      return ((EnumNameAttribute)attrs[0]).Name; 
    } 
    throw new Exception("No enum name attribute defined"); 

} 
7

您應該使用enum.Parse方法:

MyEnum myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), enumString); 

我發現的代碼片段上: http://dotnet-snippets.de/snippet/string-zu-enum/1012

+0

@wudzik:THX進行格式化。在德國很早,我仍然睏倦。 – Dannydust

+0

我知道一些事] – wudzik

+1

此外,還有第三個參數(一個布爾值)。傳遞'true'意味着解析是不區分大小寫的,有時候這可能非常有用。 –

1

我真的會建議在數據庫中存儲的數值,而不是文本值。如果您也想要數據庫中的文本值,則爲其添加一個表格。無論如何,Enum.Parse和.TryParse方法將轉換一個String,而.ToObject方法將轉換文本或數字。

1

如何使preferencekey列的枚舉這是最好的優化的方式

那麼恐怕你不能使用你的喜好鍵枚舉有2個原因字符串類型。

  1. 您的偏好鍵以整數值開始,使其成爲無效標識符。
  2. 它也包含-這也是不允許的。

但是,如果您能夠將您的首選項轉換爲某些有效的標識符,那麼您可以執行此操作。

我將電子書籍使用Enum.TryParse用於解析因爲

的TryParse(字符串,布爾值,TEnum)是相同的解析(類型,字符串,布爾值)的方法,不同之處在於代替拋出異常,則返回如果轉換失敗,則爲false。它在解析枚舉值的字符串表示時消除了對異常處理的需要。

像這樣的事情

string testingString = "Test1"; 
SomeEnum result; 
if (Enum.TryParse(testingString, out result)) 
{ 
    Console.WriteLine("Success"); 
} 

,或者大小寫不要緊,給你。然後你可以使用重載這樣

if (Enum.TryParse(testingString,true, out result))  
    Console.WriteLine("Success"); 

其中SomeEnum是

public enum SomeEnum 
    { 
     Test1 = 1, 
     Test2 = 2 
    } 
0

擴展您的輔助方法的simples辦法做到這一點是:

1 )創建一個代表所有可能的首選鍵值的枚舉,但添加一個值爲-1的'無效'。

enum PreferenceKey 
{ 
    INVALID = -1, 
    SIX_E_SF_TYPE = 0, 
    SIX_E_SF_VALUE = 1, 
    ... 
} 

2)創建包含在同一順序的所有首鍵值的字符串表示的枚舉字符串列表。

private List<string> strings = new List<string> {"6E-SF-TYPE", "6E-SF-VALUE", ...}; 

3)查找字符串列表中的列值並將位置轉換爲枚舉值。 如果不能在字符串列表中找到的列值,的IndexOf將返回-1,這是「無效」的價值。

PreferenceKey key = (PreferenceKey) strings.IndexOf(preferenceKeyColumnValue);