Kyl*_*son 5 c# wcf enums dictionary
我有一个场景,我使用Dictionary来保存某个系统接受的事务类型列表.Dictionary中的键是一个枚举字段,值是一个int.
在系统的某个时刻,我们将要做这样的事情:
sqlCommand.Parameters.AddWithValue("@param", LookupDictionary[argument.enumField]);
Run Code Online (Sandbox Code Playgroud)
当我们在字典中查找字段时,我们将获得正确的整数值以提供给数据库.我已经考虑过为此实际使用enum int值,但这并不完全正确.我们正在与一个系统交互,我们需要提供一个神奇的数字来表示我们正在进行的更新.
上面的代码工作得很好.我有一个初始化方法,添加已知的类型:
LookupDictionary = new Dictionary<mynamespace.myproject.myclass.enumType, int>();
LookupDictionary.Add(enumType.entry1, 4);
LookupDictionary.Add(enumType.entry2, 5);
LookupDictionary.Add(enumType.entry3, 6);
Run Code Online (Sandbox Code Playgroud)
此代码也可以正常工作.
但是,在我真正开始使用LookupDictionary之前,我确认正在进行的请求实际上设置为我们支持的枚举值.这是LookupDictionary的主要原因,它包含有效的(有这种方法无法使用的有效枚举条目).
这是不起作用的代码:系统无法识别枚举匹配.在调试器中,我可以看到LookupDictionary中的条目列表确实显示它具有entry2的值 - 它只是像那样调用它,entry2.另一方面,传入的enumField具有完整的命名空间; mynamespace.myproject.myclass.enumType.entry2 - 我想这就是为什么它不会看到它们是相同的.
if (!LookupDictionary.ContainsKey(argument.enumField))
{
throw new InvalidOperationException("argument.enumField not valid in blahMethod.");
}
Run Code Online (Sandbox Code Playgroud)
我是否提到过这是通过WCF服务传递的?但我没有使用自动生成的代理......线路两端的两个项目共享类型作为项目引用,我在代码中构建了我的通道客户端.
有任何想法吗?我做错了吗?使用Enums作为键的字典不能很好地工作吗?这是WCF吗?
注意:感谢有关将枚举设置为包含magic int的建议.然而,我想在一个配置中设置它们,因为可能的是"魔术数字"4 5和6可能会改变.因此,如果我按照建议将它们编码到枚举中:
public enum MyEnum
{
MyValue1 = 4,
MyValue2 = 5,
MyValue3 = 6
}
Run Code Online (Sandbox Code Playgroud)
我失去了在运行时编写一个设置未来幻数的方法的能力; 相反,它需要更改代码.
不要使用枚举作为键,而是使用枚举的整数表示形式。
例如:
LookupDictionary = new Dictionary<int, int>();
LookupDictionary.Add((int)enumType.entry1, 4);
LookupDictionary.Add((int)enumType.entry2, 5);
LookupDictionary.Add((int)enumType.entry3, 6);
Run Code Online (Sandbox Code Playgroud)
这样,您就可以使用字典的相同“ContainsKey”方法。我不确定这是否比List<int>