Create instance of unknown Enum with string value using reflection in C#
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());
}
Related videos on Youtube
Jarmez De La Rocha
Updated on September 14, 2022Comments
-
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 about 11 yearsInstead of
enumType.BaseType == typeof(Enum)
it's easier (and probably equivalent) to writeenumType.IsEnum
. -
Jeppe Stig Nielsen about 11 yearsThis seems wrong in a couple of ways. (1) Your method has a
where
constraint, but you forget to "define" the typeE
and make your method generic. (2) How is one supposed to supplyE
when calling the method? It is not going to be inferred by the compiler. (3) Youris
expression is syntactically wrong. The right-hand side ofis
is an object, not a type. Maybe you meant to use!=
instead ofis
? What is the purpose? (4) The return type requires you to cast the output from the non-genericEnum.Parse
method. -
Jeppe Stig Nielsen about 11 yearsWhy did you leave the
Enum.ToObject
method? I liked it much more than going through astring
instance like you do now. -
Charles Bretana almost 8 yearsSorry, typing without compile check. Edited to fix syntax errors.