предположим, у меня есть перечисление
[Flags]
public enum E {
zero = 0,
one = 1
}
тогда я могу написать
E e;
object o = 1;
e = (E) o;
и это будет работать.
НО, если я попытаюсь сделать это во время выполнения, например
(o as IConvertible).ToType(typeof(E), null)
он вызовет InvalidCastException.
Итак, есть ли что-то, что я могу вызвать во время выполнения, и оно преобразуется из int32 в enum так же, как если бы я написал приведение, как указано выше?





Как выглядит переменная, в которой вы сохраняете результат этого преобразования? Т.е. с каким типом вы его объявляете?
Если вы хотите иметь объектную переменную, сделайте это так. Вместо null используйте Activator.CreateInstance для создания экземпляра перечисления по умолчанию:
object o = Activator.CreateInstance(typeof(E));
Я хочу, чтобы это был объект. То есть перечисление в рамке. Дело в том, что тип неизвестен во время компиляции, поэтому я не хочу объявлять «целевую» переменную с точным типом.
Теперь я вижу вашу проблему. Как показывает мой код, на самом деле это не имеет никакого отношения к кастингу. Скорее проблема заключается в создании экземпляра на основе типа среды выполнения.
Нет. Проблема ни в чем не связана с созданием объекта. У меня есть целочисленное значение, которое, скажем, происходит из файла xml. Проблема в том, как мне назначить его этому объекту? (опять же, фактический тип E поступает как параметр типа и неизвестен при компиляции типа, поэтому я не могу написать приведение)
object o = 1;
object z = Enum.ToObject(typeof(E), o);
Вы также можете использовать
Enum.Parse(typeof(E), (int)o)
meta - Поскольку этот Q работает только с перечислениями, предложите кому-то добавить «перечисление» к заголовку и / или тегам.