2008-09-19 7 views
2

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

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 и сочинительство тот же метод для них это раздражает по меньшей мере. Supposedly all enums inherit from System.Enum, но если я попытаюсь установить это как тип ввода, я получаю ошибки компиляции. Это также в .NET 1.1, поэтому для генериков не может быть и речи.

Я боролся с этим некоторое время. У кого-нибудь есть лучший способ написать этот метод? Кроме того, может ли кто-нибудь прояснить, что все перечисления наследуются от System.Enum, но не являются ли они полиморфными?

ответ

4
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

Сэр, я приветствую вас, я не совсем уверен, почему эта подпись метода работает, когда у меня есть пытались, но вы просто потрясающие. –

+0

Вы использовали (Enum e, ...) или (enum e, ...). Первый тип является типом, а последний - ключевым словом объявления. Легко перепутаться. –

-1

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

TransactionStatus status = (TransactionStatus)Enum.Parse(typeof(TransactionStatus), obj.ToString()); 
+0

Я сожалею, я не понимаю - как бы эта помощь? Теперь я бы сравнил две перечисления, и это замечательно, но какова будет подпись вспомогательного метода? –

0

Перечисление, как правило, грязные в 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

Это оставляет мне ту же загадку, что нужно переписывать эту функцию снова и снова, даже если все, предположительно, наследуется от Enum! –

-2

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

protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) { 
    return (char)enum_status == (char)obj_status; 
} 
+0

Это не касается моей озабоченности по поводу сигнатуры метода и b) не будет компилироваться, поскольку вы не можете наложить объект на char –

 Смежные вопросы

  • Нет связанных вопросов^_^