我正在处理WCF服务,并希望将首选项键作为枚举而不是字符串返回。
如何以最佳方式制作字符串类型的preferencekey列的枚举?
答案 0 :(得分:8)
您应该使用enum.Parse方法:
MyEnum myEnum = (MyEnum)Enum.Parse(typeof(MyEnum), enumString);
我找到了代码段: http://dotnet-snippets.de/snippet/string-zu-enum/1012
答案 1 :(得分:2)
罗希特夏尔,
preferenceKey
的值无法像您期望的那样轻松转换为枚举。可以使用Enum.Parse()方法解析字符串,但枚举名称必须与数据库中的名称不同。问题是
-
个字符现在有人说你可以设计一种不同的方法来命名enum的枚举作为一个例子(我个人不喜欢这个例子,但可能有用)。
首先定义一个名为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");
}
答案 2 :(得分:1)
我真的建议在数据库中存储数值而不是文本值。如果您还想要数据库中的文本值,那么为它添加一个表。无论如何,Enum.Parse和.TryParse方法将转换String,而.ToObject方法将转换文本或数字。
答案 3 :(得分:1)
如何以最佳方式制作字符串类型的preferencekey列的枚举
好吧,我担心你不能使用你的偏好键作为枚举有两个原因。
但是,如果您能够将首选项密钥转换为某些有效标识符,则可以执行此操作。
我建议使用Enum.TryParse进行解析,因为
TryParse(String,Boolean,TEnum)与Parse(Type,String,Boolean)方法相同,不同之处在于,如果转换失败,它将返回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
}
答案 4 :(得分:0)
这样做的简单方法是:
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);