【发布时间】:2010-03-05 00:48:55
【问题描述】:
我有一个场景,我使用字典来保存某个系统接受的交易类型列表。 Dictionary 中的 key 是 enum 字段,value 是 int。
在系统中的某个时刻,我们会想要做这样的事情:
sqlCommand.Parameters.AddWithValue("@param", LookupDictionary[argument.enumField]);
当我们在字典中查找该字段时,我们将获得正确的整数值以提供给数据库。我曾考虑过为此实际使用 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);
这段代码也可以正常工作。
但在上面,在我真正开始使用 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.");
}
我是否提到这是通过 WCF 服务传递的?但是我没有使用自动生成的代理......线路两侧的两个项目都共享类型作为项目引用,并且我在代码中构建了我的频道客户端。
有什么想法吗?我做错了吗?以枚举为键的字典不能很好地工作吗?这是 WCF 的事情吗?
注意:感谢有关设置枚举以包含魔法 int 的建议。但是,我想将它们设置为配置,因为“幻数” 4 5 和 6 可能会在未来发生变化。因此,如果我按照建议将它们编码到枚举中:
public enum MyEnum
{
MyValue1 = 4,
MyValue2 = 5,
MyValue3 = 6
}
我失去了编写在运行时设置未来幻数的方法的能力;相反,它需要更改代码。
【问题讨论】:
-
字典没有枚举类型作为键的问题,我怀疑它与WCF有关。这里只有很小的 sn-ps 代码 - 一个简短但完整的重现问题的程序可能会导致一些答案。从最简单的情况开始 - 将枚举键添加到字典中,并验证它是否存在。然后逐步构建它,直到找到代码失败的地方。
-
我相信你是对的。我有一种强烈的感觉,我只是在某个地方出现了一些小错误;只是想我会把它扔在那里。至少我认识的一个 WCF 人员认为它可能是自动生成的代理,这就是为什么我根据我的 DataContracts 的共享项目重新组织。一切都很顺利,但并没有解决问题。
标签: c# wcf dictionary enums