Мне нужен вспомогательный метод для сравнения перечисления символов и символа, помещенного в рамку, с объектом
Вопрос
У меня есть перечисление, которое выглядит следующим образом:
public enum TransactionStatus { Open = 'O', Closed = 'C'};
и я извлекаю данные из базы данных с помощью одного символа, указывающего - как вы уже догадались - на то, открыта ли транзакция через "O" или через "C" транзакция закрыта.
теперь, поскольку данные поступают из базы данных в виде объекта, у меня уходит чертовски много времени на написание кода сравнения.
Лучшее, что я могу сделать, это написать:
protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) {
return ((char)enum_status).ToString() == obj_status.ToString();
}
Однако это не единственное перечисление символов, с которым мне приходится иметь дело, у меня их 5 или 6, и написание для них одного и того же метода, мягко говоря, раздражает. Предположительно, все перечисления наследуются от System.Enum но если я попытаюсь установить это в качестве типа ввода, я получу ошибки компиляции.Это также есть в .NET 1.1, так что о дженериках не может быть и речи.
Я боролся с этим некоторое время.У кого-нибудь есть лучший способ написать этот метод?Кроме того, кто-нибудь может уточнить, что все перечисления наследуются от System.Перечисления, но не являются полиморфной вещью?
Решение
static void Main(string[] args)
{
object val = 'O';
Console.WriteLine(EnumEqual(TransactionStatus.Open, val));
val = 'R';
Console.WriteLine(EnumEqual(DirectionStatus.Left, val));
Console.ReadLine();
}
public static bool EnumEqual(Enum e, object boxedValue)
{
return e.Equals(Enum.ToObject(e.GetType(), (char)boxedValue));
}
public enum TransactionStatus { Open = 'O', Closed = 'C' };
public enum DirectionStatus { Left = 'L', Right = 'R' };
Другие советы
Перечисления, как правило, беспорядочны в C #, поэтому при использовании .NET 2.0 принято оборачивать синтаксис обобщениями, чтобы избежать необходимости писать такой неуклюжий код.
В .NET 1.1 вы можете сделать что-то вроде приведенного ниже, хотя это не намного опрятнее исходного фрагмента:
protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status)
{
return (enum_status == Enum.Parse(typeof(TransactionStatus), obj_status.ToString()));
}
Это примерно такой же объем кода, но теперь вы выполняете перечисление, а не сравнение строк.
Вы также могли бы использовать отладчик / документацию, чтобы узнать, есть ли obj_status
действительно ли это объект или можете ли вы безопасно преобразовать его в строку.
Я бы взглянул на Enum.Parse .Это позволит вам разобрать ваш символ обратно в нужное перечисление.Я считаю, что это работает вплоть до C # 1.0.Ваш код будет выглядеть примерно так:
TransactionStatus status = (TransactionStatus)Enum.Parse(typeof(TransactionStatus), obj.ToString());
Если вам просто нужно сравнить значения, вы можете использовать что-то вроде:
protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) {
return (char)enum_status == (char)obj_status;
}