У меня есть сценарий, в котором я использую Словарь для хранения списка типов транзакций, которые принимает определенная система. Ключ в словаре - это поле enum, значение - 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, я проверяю, что выполняемый запрос на самом деле установлен в значение enum, которое мы поддерживаем. Это главная причина LookupDictionary, он содержит действительные (есть допустимые записи enum, с которыми этот метод не работает).
Это код, который не работает: система не может распознать, что перечисления совпадают. В отладчике я вижу, что список записей в 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
}
Я теряю способность писать метод, который устанавливает магические числа в будущем во время выполнения; вместо этого потребуется изменение кода.