Мне нужен вспомогательный метод для сравнения char Enum и char в штучной упаковке с объектом - PullRequest
2 голосов
/ 20 сентября 2008

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

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.Enum, но не являются ли они полиморфными?

Ответы [ 4 ]

4 голосов
/ 20 сентября 2008
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' };
0 голосов
/ 20 сентября 2008

Перечисления, как правило, беспорядочные в 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 является объектом или вы можете безопасно преобразовать его в строку.

0 голосов
/ 20 сентября 2008

Если вам просто нужно сравнить значения, вы можете использовать что-то вроде:

protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) {
    return (char)enum_status == (char)obj_status;
}
0 голосов
/ 20 сентября 2008

Я бы посмотрел на Enum.Parse. Это позволит вам разобрать ваш символ обратно в правильное перечисление. Я считаю, что это работает вплоть до C # 1.0. Ваш код будет выглядеть примерно так:

TransactionStatus status = (TransactionStatus)Enum.Parse(typeof(TransactionStatus), obj.ToString());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...