I necessário um método auxiliar para comparar um char enum e um char encaixotado para um objecto

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

  •  01-07-2019
  •  | 
  •  

Pergunta

Eu tenho um enum que é o seguinte:

public enum TransactionStatus { Open = 'O', Closed = 'C'};

e eu estou puxando os dados do banco de dados com um único caractere indicando - você adivinhou - se 'O' da transação está aberta ou 'C' a transação é fechada

.

agora porque os dados sai do banco de dados como um objeto Estou tendo um pedaço de um código de comparação de tempo escrevendo.

O melhor que posso fazer é escrever:

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

No entanto, este não é o único enum personagem que eu tenho que lidar com, eu tenho 5 ou 6 e escrevendo o mesmo método para eles é irritante para dizer o mínimo. Supostamente todos os enums herdam de System.Enum mas se eu tentar definir isso como o tipo de entrada eu recebo erros de compilação. Esta é também em .NET 1.1 para que os genéricos estão fora de questão.

Eu estive lutando com isso por um tempo. Alguém tem uma maneira melhor de escrever este método? Além disso, alguém pode esclarecer todo o enums herdam System.Enum mas não são coisa polimórfica?

Foi útil?

Solução

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' };

Outras dicas

enumerações são geralmente bagunçado em C # por isso, quando usando .NET 2.0 seu comum para embrulhar a sintaxe com genéricos para evitar ter de escrever tal código desajeitado.

Em .NET 1.1 você pode fazer algo como o abaixo, embora não seja muito mais arrumado do que o trecho original:

protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status)
{
    return (enum_status == Enum.Parse(typeof(TransactionStatus), obj_status.ToString()));
}

Esta é aproximadamente a mesma quantidade de código, mas você está fazendo agora enum em vez de comparação de cadeia.

Você também pode usar o depurador / documentação para ver se obj_status realmente é um objeto ou se você pode seguramente converter para uma string.

Gostaria de dar uma olhada em Enum.Parse. Ele permitirá que você analisar suas costas carvão na enumeração adequada. Eu acredito que funciona todo o caminho de volta para C # 1.0. Seu código ficaria um pouco como este:

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

Se você só tem que comparar os valores que você pode usar algo como:

protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) {
    return (char)enum_status == (char)obj_status;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top