c# - 将枚举作为字典集合中的键出现问题

标签 c# wcf dictionary enums

我有一个场景,我使用字典来保存某个系统接受的交易类型列表。 Dictionary 中的键是一个枚举字段,值是一个 int。

在系统的某个时刻,我们想要做这样的事情:

sqlCommand.Parameters.AddWithValue("@param", LookupDictionary[argument.enumField]);

当我们在字典中查找字段时,我们将获得正确的整数值以提供给数据库。我考虑过为此实际使用 enum int 值,但这并不完全正确。我们正在与一个系统交互,我们需要在其中输入一个魔数(Magic Number)来表示我们正在进行的更新类型。

上面的代码工作得很好。我有一个添加已知类型的初始化方法:

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 服务传递的?但是我没有使用自动生成的代理……线路两侧的两个项目都共享类型作为项目引用,并且我在代码中构建了我的 channel 客户端。

有什么想法吗?我做错了吗?以枚举作为键的字典不能正常工作吗?它是 WCF 的东西吗?

注意:感谢您提供有关设置枚举以包含魔法整数的建议。然而,我想在配置中设置它们,因为“魔数(Magic Number)”4、5 和 6 可能会在未来发生变化。因此,如果我按照建议将它们编码到枚举中:

public enum MyEnum
{
    MyValue1 = 4,
    MyValue2 = 5,
    MyValue3 = 6
}

我无法编写在运行时设置 future 魔数(Magic Number)的方法;相反,它需要更改代码。

最佳答案

不使用枚举作为键,而是使用枚举的整数表示。

例如:

LookupDictionary = new Dictionary<int, int>();
LookupDictionary.Add((int)enumType.entry1, 4);
LookupDictionary.Add((int)enumType.entry2, 5);
LookupDictionary.Add((int)enumType.entry3, 6);

这样,您就可以使用与字典相同的“ContainsKey”方法。我不确定这是否比 List<int> 好得多

关于c# - 将枚举作为字典集合中的键出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2383824/

相关文章:

java - 将 Apache Tomcat Web 服务器与 Microsoft Visual Studio .net 框架集成

c# - 如何在 CaSTLe Windsor WcfClient 上设置超时属性

python - 添加保持零值的计数器

Java Map 在 ActionScript 中的等效实现?

c++ - 在 C++ 中使用 map 的迭代差异

c# - 从 EventStore 获取事件

Windows Phone 8 的 C# 游戏开发?

wcf - 如何使用 Mono 创建 WCF 服务?

wcf - 如何使用 WCF 传输大文件

c# - 使用 Stream 时使用请求头传递参数