Ho bisogno di un metodo di supporto per confrontare un Enum char e un char box in un oggetto

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

  •  01-07-2019
  •  | 
  •  

Domanda

Ho un enum che ha il seguente aspetto:

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

e sto estraendo i dati dal database con un singolo carattere che indica - avete indovinato - se 'O' la transazione è aperta o 'C' la transazione è chiusa.

ora perché i dati escono dal database come oggetto, ho un sacco di tempo a scrivere il codice di confronto.

Il meglio che posso fare è scrivere:

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

Tuttavia, questo non è l'unico enum dei personaggi che devo affrontare, ne ho 5 o 6 e scrivere lo stesso metodo per loro è a dir poco fastidioso. Presumibilmente tutti gli enum ereditano da System.Enum ma se provo a impostarlo come tipo di input ottengo errori di compilazione. Questo è anche in .NET 1.1, quindi i generici sono fuori discussione.

Ho lottato con questo per un po '. Qualcuno ha un modo migliore di scrivere questo metodo? Inoltre, qualcuno può chiarire tutti gli enum ereditati da System.Enum ma non sono cose polimorfiche?

È stato utile?

Soluzione

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

Altri suggerimenti

Gli enum sono generalmente disordinati in C #, quindi quando si utilizza .NET 2.0 è comune avvolgere la sintassi con generici per evitare di dover scrivere un codice così goffo.

In .NET 1.1 puoi fare qualcosa come il seguente, anche se non è molto più ordinato dello snippet originale:

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

Si tratta della stessa quantità di codice ma ora stai eseguendo enum piuttosto che un confronto di stringhe.

Puoi anche usare il debugger / documentazione per vedere se obj_status è davvero un oggetto o se puoi tranquillamente lanciarlo su una stringa.

Darei un'occhiata a Enum.Parse. Ti consentirà di analizzare nuovamente il tuo personaggio nel giusto enum. Credo che funzioni fino a C # 1.0. Il tuo codice sarebbe un po 'così:

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

Se devi solo confrontare i valori, puoi usare qualcosa come:

protected bool CharEnumEqualsCharObj(TransactionStatus enum_status, object obj_status) {
    return (char)enum_status == (char)obj_status;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top