我有一个场景,我使用字典来保存特定系统接受的事务类型列表。 Dictionary中的键是一个枚举字段,其值是一个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服务传递的?但是我没有使用自动生成的代理...线路两侧的两个项目都将这些类型作为项目引用共享,并且我使用代码构建了我的通道客户端。
任何想法?我做错了吗?使用Enums作为密钥的字典无法正常工作?这是一个WCF的东西吗?
注意:感谢您的建议有关设置枚举最多包含magic int。然而,我想把它们设置成一个配置,因为它有可能“幻数”4,5和6可能会改变。所以,如果我到枚举代码,他们的建议:
public enum MyEnum
{
MyValue1 = 4,
MyValue2 = 5,
MyValue3 = 6
}
我输写在运行时也设定在未来的幻数的方法的能力;相反,它需要更改代码。
字典与枚举类型没有问题,我怀疑它与WCF有关。这里只有很少的代码片段 - 一个简短但完整的程序重现了这个问题可能会带来一些答案。从最简单的情况开始 - 将一个枚举键添加到字典中,并验证它是否存在。然后逐渐建立起来,直到你碰到你的代码失败的地方。 – Aaronaught 2010-03-05 01:33:39
我相信你是对的。我有一种强烈的感觉,我在某处遇到了一些小错误;只是以为我会把它扔到那里。至少有一位我认识的WCF人士认为它可能是自动生成的代理,这就是为什么我基于DataContracts的共享项目重新组织的原因。一切都很顺利,但并没有解决问题。 – 2010-03-05 19:47:52