Yes, reflection can get this done. Assume we have an Enum type - Colors, the following code will print the name and value for each member of it.

foreach (FieldInfo fi in typeof(Colors).GetFields(BindingFlags.Public | BindingFlags.Static))
{
   Console.WriteLine(fi.Name);
   Console.WriteLine(fi.GetValue(null));
}

Note we need to specify BindingFlags.Static explicitly here; Otherwise, both static and instance fields will get returned, including the special instance field "value__".

In fact, BCL provides more neat (and maybe faster) APIs to achieve this:

string[] names = Enum.GetNames(typeof(Colors));
Colors[] values = (Colors[])Enum.GetValues(typeof(Colors));

If the enum type we are exploring is loaded in the ReflectionOnly context, calling FieldInfo.GetValue will throw "InvalidOperationException: Code execution is prohibited in an assembly loaded as ReflectionOnly", since GetValue tries to create an object of the enum type and return it. Same for Enum.GetValues.

The new API in FieldInfo:

public virtual object GetRawConstantValue();

could be what you need in such scenarios. It will return the value of enum's underlying integer type. For example, if the underlying type of enum "Colors" is byte, fi.GetRawConstandValue() will return a boxed byte.