轉換成字符串枚舉
回答
羅希特,
的preferenceKey
的數值不能很容易地轉換到一個枚舉如你所願。可以使用Enum.Parse()方法分析字符串,但枚舉名稱必須與數據庫中的不同。這些問題是
- 你的字符串以數字開頭
- 你的字符串包含
-
字符
現在這樣說,你可以設計出不同的方法來枚舉的您的命名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");
}
您應該使用enum.Parse方法:
MyEnum myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), enumString);
我發現的代碼片段上: http://dotnet-snippets.de/snippet/string-zu-enum/1012
我真的會建議在數據庫中存儲的數值,而不是文本值。如果您也想要數據庫中的文本值,則爲其添加一個表格。無論如何,Enum.Parse和.TryParse方法將轉換一個String,而.ToObject方法將轉換文本或數字。
如何使preferencekey列的枚舉這是最好的優化的方式
那麼恐怕你不能使用你的喜好鍵枚舉有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
}
擴展您的輔助方法的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);
- 1. Ada要枚舉轉換的字符串
- 2. 轉換整數枚舉字符串
- 3. 字符串轉換枚舉在C#中
- 4. 將字符串轉換爲枚舉?
- 5. 枚舉轉換爲字符串
- 6. 枚舉拒絕轉換爲字符串
- 7. 將字符串轉換爲枚舉?
- 8. 字符串轉換爲枚舉的枚舉名
- 9. 替換字符串與枚舉枚舉生成自動protobuf的
- 10. 到處尋找一個枚舉被轉換成字符串
- 11. 驗證成功的字符串在Java中枚舉轉換
- 12. JAXB - 從XSD生成類 - 將枚舉轉換爲字符串
- 13. 字符串枚舉
- 14. NSStringEncoding - 枚舉到字符串枚舉
- 15. 轉換枚舉來枚舉
- 16. 將字符串字段轉換爲Swashbuckle中的枚舉字段
- 17. 枚舉成員上的字符串化
- 18. 將文化特定的枚舉DisplayName字符串轉換爲枚舉
- 19. 將數字轉換爲在bash中的字符串枚舉
- 20. 不能枚舉轉換爲字符串打字稿2
- 21. 轉換INT(即從枚舉鑄造)字符串是給枚舉值回爲字符串
- 22. 多個枚舉字符串
- 23. 枚舉字符串匹配
- 24. 鑄造字符串枚舉
- 25. NoSql:枚舉vs字符串
- 26. C++ Bitflaged枚舉字符串
- 27. 枚舉爲字符串
- 28. 枚舉到字符串C++
- 29. 字符串到枚舉C++
- 30. 從字符串枚舉
我不能改變數據庫結構。 – Rohit