Create instance of unknown Enum with string value using reflection in C#

12,969

Solution 1

Use the ToObject method on the Enum class:

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

Or like the code you provided:

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

Solution 2

Use (ENUMName)Enum.Parse(typeof(ENUMName), integerValue.ToString())

as a generic function (edited to correct syntax errors)...

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

old wrong version:

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());
}
Share:
12,969

Related videos on Youtube

Jarmez De La Rocha
Author by

Jarmez De La Rocha

Updated on September 14, 2022

Comments

  • Jarmez De La Rocha
    Jarmez De La Rocha over 1 year

    I have a problem working out how exactly to create an instance of an enum when at runtime i have the System.Type of the enum and have checked that the BaseType is System.Enum, my value is an int value matching an item in the mystery Enum.

    The code i have so far is just the logic described above as shown below.

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

    When working with Enums in the past i have always know at code time which enum i am trying to parse but in this scenario im confused and have had little luck articulating my question in a google friendly way... I would usually do something like

    (SomeEnumType)int
    

    but since i dont know the EnumType at code time how can i achieve the same thing?

  • Jeppe Stig Nielsen
    Jeppe Stig Nielsen about 11 years
    Instead of enumType.BaseType == typeof(Enum) it's easier (and probably equivalent) to write enumType.IsEnum.
  • Jeppe Stig Nielsen
    Jeppe Stig Nielsen about 11 years
    This seems wrong in a couple of ways. (1) Your method has a where constraint, but you forget to "define" the type E and make your method generic. (2) How is one supposed to supply E when calling the method? It is not going to be inferred by the compiler. (3) Your is expression is syntactically wrong. The right-hand side of is is an object, not a type. Maybe you meant to use != instead of is? What is the purpose? (4) The return type requires you to cast the output from the non-generic Enum.Parse method.
  • Jeppe Stig Nielsen
    Jeppe Stig Nielsen about 11 years
    Why did you leave the Enum.ToObject method? I liked it much more than going through a string instance like you do now.
  • Charles Bretana
    Charles Bretana almost 8 years
    Sorry, typing without compile check. Edited to fix syntax errors.