Мне нужен вспомогательный метод для сравнения перечисления символов и символа, помещенного в рамку, с объектом

StackOverflow https://stackoverflow.com/questions/105609

  •  01-07-2019
  •  | 
  •  

Вопрос

У меня есть перечисление, которое выглядит следующим образом:

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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top