2016-06-17 28 views
7

Recentemente ho visto un progetto che stava usando questo stile:Casting per enum vs. Enum.ToObject

(SomeEnum)Enum.ToObject(typeof(SomeEnum), some int) 

al posto di questo stile:

(SomeEnum)some int 

Perché utilizzare l'ex? È solo una questione di stile?

Da MSDN:

Questo metodo di conversione restituisce un valore di tipo Object. È quindi possibile eseguire il cast dello o convertirlo in un oggetto di tipo enumType.

https://msdn.microsoft.com/en-us/library/ksbe1e7h(v=vs.110).aspx

Mi sembra che MSDN mi dice che devo chiamare ToObject(), e poi posso pressofuso. Ma sono confuso perché so che posso lanciare senza chiamare quel metodo. Qual è lo scopo di ToObject()? Cosa fa che il semplice casting non lo fa?

+0

codice non ha senso. Puoi lanciare un enum a un numero, ma non un numero di enum. Il giorno della settimana per zero dovrebbe essere DayOfWeek.Sunday non il numero zero. – jdweng

+0

Ho dichiarato esplicitamente che era uno stile di codifica alla prima frase. Ovviamente il codice non ha senso. Era solo per illustrare. Sto chiedendo qual è lo scopo di Enum.ToObject(). Cosa fa che il semplice casting non lo fa? – HelloWorld

+1

Nessuna idea, ma il fatto che questo metodo fosse in .NET 1.1 potrebbe dare un suggerimento. C'è un sacco di cose da quei giorni che non dovrebbero essere più utilizzate (guardandoti con 'ArrayList') – BradleyDotNET

risposta

6

Nella maggior parte dei casi è sufficiente il cast semplice.

Ma a volte si ottiene il tipo solo in fase di esecuzione. Ecco che arriva Enum.ToObject in gioco. Può essere utilizzato nei casi in cui è necessario ottenere in modo dinamico valori enum (o forse metadati (attributi) associati ai valori enum). Ecco un semplice esempio:

enum Color { Red = 1, Green, Blue } 
enum Theme { Dark = 1, Light, NotSure } 

public static void Main(string[] args) 
{ 
    var elements = new[] 
    { 
     new { Value = 1, Type = typeof(Color) }, 
     new { Value = 2, Type = typeof(Theme) }, 
     new { Value = 3, Type = typeof(Color) }, 
     new { Value = 1, Type = typeof(Theme) }, 
     new { Value = 2, Type = typeof(Color) }, 
    }; 

    foreach (var element in elements) 
    { 
     var enumValue = Enum.ToObject(element.Type, element.Value); 
     Console.WriteLine($"{element.Type.Name}({element.Value}) = {enumValue}"); 
    } 
} 

uscita è:

Color(1) = Red 
Theme(2) = Light 
Color(3) = Blue 
Theme(1) = Dark 
Color(2) = Green 

More info on enum casting