2013-04-06 8 views
7

Mam problem z ustaleniem, jak dokładnie utworzyć instancję wyliczenia, gdy w czasie wykonywania mam typ System.Tumblacji wyliczeniowej i sprawdziłem, że BaseType to System .Enum, moja wartość jest wartością int pasującą do elementu w tajemniczej Enum.Tworzenie instancji nieznanego Enum z wartością ciągu za pomocą odbicia w C#

Dotychczasowy kod to tylko logika opisana powyżej, jak pokazano poniżej.

 if (Type.GetType(type) != null) 
     { 
      if (Type.GetType(type).BaseType.ToString() == "System.Enum") 
      { 
       return ???; 
      } 
     } 

Podczas pracy z wyliczenia w przeszłości zawsze wiedzieć w momencie wyliczenia kodu, który próbuję analizować, ale w tym scenariuszu im zdezorientowany i mieli trochę szczęścia artykulacji moje pytanie w sposób przyjazny google ... Zwykle robiłbym coś takiego jak , ale ponieważ nie wiem EnumType w czasie kodu jak mogę osiągnąć to samo?

+0

To jest trochę mylące, co chcesz robić po „wrócić ???”, i dlaczego trzeba odbicie w tym przypadku. Nadal możesz zrobić to samo (SomeEnumType), aby przesłać typ do SomeEnumType. – outcoldman

+0

Problem polega na tym, że nie wiem, czym może być Enum, w czasie pracy może to być dowolny. Powrót? byłoby coś w stylu: [kod] Enum.Parse (Type.GetType (type), ob); [/ code] –

+0

Ten wiersz 'Type.GetType (type) .BaseType.ToString() ==" System.Enum " 'mówi mi, że obiekt' type' ma już typ 'SomeEnumType', więc dlaczego musisz go przekonwertować z' SomeEnumType' na 'SomeEnumType'? Czy możesz podać więcej informacji na temat tego, co chcesz z tym osiągnąć? – outcoldman

Odpowiedz

10

Użyj metody ToObject od klasy Enum:

var enumValue = Enum.ToObject(type, value); 

Albo jak kod podany:

if (Type.GetType(type) != null) 
{ 
    var enumType = Type.GetType(type); 
    if (enumType.IsEnum) 
    { 
     return Enum.ToObject(enumType, value); 
    } 
} 
+1

Zamiast 'enumType.BaseType == typeof (Enum)' łatwiej jest (i prawdopodobnie równoznaczne) napisać 'enumType.IsEnum'. –

+0

Dlaczego opuściłeś metodę 'Enum.ToObject'? Podobało mi się to znacznie bardziej niż przechodzenie przez instancję 'string', tak jak teraz. –

0

użytkowania (ENUMName)Enum.Parse(typeof(ENUMName), integerValue.ToString())

jako funkcję rodzajowe (edytowane w celu skorygowania błędów składniowych) ...

public static E GetEnumValue<E>(Type enumType, int value) 
         where E : struct 
    { 
     if (!(enumType.IsEnum)) throw new ArgumentException("Not an Enum"); 
     if (typeof(E) != enumType) 
      throw new ArgumentException(
       $"Type {enumType} is not an {typeof(E)}"); 
     return (E)Enum.Parse(enumType, value.ToString()); 
    } 

stary źle wersja:

public E GetEnumValue(Type enumType, int value) where E: struct 
{ 
    if(!(enumType.IsEnum)) throw ArgumentException("Not an Enum"); 
    if (!(typeof(E) is enumType)) 
     throw ArgumentException(string.format(
      "Type {0} is not an {1}", enumType, typeof(E)); 
    return Enum.Parse(enumType, value.ToString()); 
} 
+1

To wydaje się złe na kilka sposobów. (1) Twoja metoda ma ograniczenie "where", ale zapomniałeś "zdefiniować" typ 'E' i uczynić swoją metodę ogólną. (2) W jaki sposób należy podać 'E' podczas wywoływania metody? To nie będzie wywnioskowane przez kompilator. (3) Wyrażenie "jest" jest syntaktycznie błędne. Prawa strona 'jest' jest obiektem, a nie typem. Może chciałeś użyć '! =' Zamiast 'is'? Co jest celem? (4) Typ zwracany wymaga rzutowania danych wyjściowych z nietypowej metody 'Enum.Parse'. –

+0

Przepraszam, pisanie bez sprawdzania kompilacji. Edytowane w celu naprawienia błędów składni. –

Powiązane problemy