2016-06-17 8 views
7

Widziałem niedawno projekt, który używał tego styl:Casting do ENUM vs Enum.ToObject

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

zamiast tego stylu:

(SomeEnum)some int 

Dlaczego warto korzystać z byłym? Czy to tylko kwestia stylu?

Od MSDN:

Ta metoda konwersji zwraca wartość typu Object. Następnie możesz je odrzucić lub przekonwertować na obiekt typu enumType.

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

Wydaje mi się, że MSDN mówi mi, że powinienem zadzwonić ToObject(), a następnie mogę rzucić. Ale jestem zdezorientowany, ponieważ wiem, że mogę rzucać bez wywoływania tej metody. Jaki jest cel ToObject()? Co robi ten prosty odlew?

+0

Kodeks nie ma sensu. Możesz rzucić wyliczenie na liczbę, ale nie wyliczać liczby. Dzień tygodnia dla zera powinien być DayOfWeek.Sunday nie liczba zero. – jdweng

+0

Wyraźnie stwierdziłem, że był to styl kodowania w pierwszym zdaniu. Oczywiście kod nie ma sensu. To było tylko po to, żeby to zilustrować. Pytam, jaki jest cel Enum.ToObject(). Co robi ten prosty odlew? – HelloWorld

+1

Nie mam pojęcia, ale fakt, że ta metoda była w .NET 1.1 może dać wskazówkę. Jest kilka rzeczy z tamtych dni, które naprawdę nie powinny być już używane (patrząc na ciebie 'ArrayList') – BradleyDotNET

Odpowiedz

6

W większości przypadków wystarczy zwykła obsada.

Ale czasami pojawia się tylko typ w czasie wykonywania. W grę wchodzi Enum.ToObject. Może być używany w przypadkach, gdy potrzebujesz dynamicznie uzyskać wartości wyliczeniowe (lub może metadane (atrybuty) dołączone do wartości wyliczeniowych). Oto prosty przykład:

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}"); 
    } 
} 

wyjściowa wynosi:

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

More info on enum casting