Tengo un escenario en el que estoy usando un diccionario para contener una lista de tipos de transacciones que acepta un determinado sistema. La clave en el Diccionario es un campo enum, el valor es un int.Problema con una enumeración como clave en una colección de diccionarios
En algún punto del sistema, vamos a querer hacer algo como esto:
sqlCommand.Parameters.AddWithValue("@param", LookupDictionary[argument.enumField]);
Cuando miramos el campo en el diccionario, vamos a obtener el valor entero correcta para alimentar a la base de datos. He pensado en usar realmente el valor enum int para esto, pero eso no es exactamente correcto. Estamos interactuando con un sistema donde necesitamos alimentar un número mágico para representar el tipo de actualización que estamos haciendo.
El código anterior funciona bien. Tengo un método de inicialización que añade los tipos conocidos:
LookupDictionary = new Dictionary<mynamespace.myproject.myclass.enumType, int>();
LookupDictionary.Add(enumType.entry1, 4);
LookupDictionary.Add(enumType.entry2, 5);
LookupDictionary.Add(enumType.entry3, 6);
Este código también funciona bien.
Pero arriba, antes de entrar al uso de LookupDictionary, confirmo que la solicitud que se está realizando está realmente configurada en un valor enum que admitimos. Esa es la razón principal de LookupDictionary, contiene los válidos (hay entradas enum válidas con las que este método no funciona).
Este es el código que no funciona: el sistema no reconoce que las enumeraciones coinciden. En el depurador, puedo ver que la lista de entradas en LookupDictionary muestra que tiene el valor para entry2; simplemente lo llama así, entry2. El enumField entrante, por otro lado, tiene el espacio de nombre completo; mynamespace.myproject.myclass.enumType.entry2 - Me imagino que es por eso que no los ve como iguales.
if (!LookupDictionary.ContainsKey(argument.enumField))
{
throw new InvalidOperationException("argument.enumField not valid in blahMethod.");
}
¿He mencionado que esto se está transmitiendo a través de un servicio de WCF? Pero no estoy usando un proxy autogenerado ... ambos proyectos en ambos lados del cable comparten los tipos como referencia de proyecto, y construyo mi cliente de canal en código.
¿Alguna idea? ¿Lo estoy haciendo mal? ¿Los diccionarios con enumeraciones como claves no funcionan bien? ¿Es una cosa de WCF?
Nota: gracias por las sugerencias con respecto a la configuración de las enumeraciones para contener la magia int. Sin embargo, quería establecerlos en una configuración, ya que es posible que los "números mágicos" 4 5 y 6 cambien en el futuro. Así que si yo codificarlos en la enumeración como se sugiere:
public enum MyEnum
{
MyValue1 = 4,
MyValue2 = 5,
MyValue3 = 6
}
que pierden la capacidad de escribir un método que pone en marcha los números mágicos en el futuro en tiempo de ejecución; en cambio, requeriría un cambio de código.
Un diccionario no tiene ningún problema con los tipos de enumeración como claves, y dudo que esté relacionado con WCF. Aquí solo hay pequeños fragmentos de código: un programa breve pero completo que reproduzca el problema probablemente genere algunas respuestas. Comience con el caso más simple posible: agregue una clave de enumeración a un diccionario y verifique que esté allí. Luego, protéjala gradualmente hasta que toques el lugar donde falla tu código. – Aaronaught
Estoy seguro de que tienes razón. Tengo una fuerte sensación de que acabo de tener algún pequeño error en alguna parte; solo pensé en tirarlo allí. Al menos una persona de WCF que conozco pensó que podrían ser los proxies autogenerados, por lo que me reorganicé en base a un proyecto compartido para mis DataContracts. Todo fue genial, pero no solucionó el problema. –