Конвертировать enum из объекта в long без блока try?

2

Следуйте в моем тестовом источнике. Что такое хороший способ получить значение из объекта enum? Должна поддерживать долго. Я пытаюсь без блока try/catch.

enum ELong: long { a = 0x100000000 };
enum ENormal { a = 25 }

        var l = (object) ELong.a;
        var n = (object)ENormal.a;
        //will cast into the correct size
        int ii = (int)n; //ok
        long ll = (long)l; //ok
        //wont cast if its too big
        ll = (long)n; //cast exception
        //or too small
        n = (int)l; //cast exception//compile error. Cannot cast
        //lets try preventing the exception with is
        if (n is int)
            ii = (int)n;//doesnt get here.
        if (n is long)
            ll = (long)n;//doesnt get here.
        if (l is int)
            ii = (int)l;//doesnt get here
        if (l is long)
            ll = (long)l;//doesnt get here
        //WHY!!!!
        //Maybe as will do the trick?
        if (n as int? != null)
            ii = (int)n;//doesnt get here.
        if (n as long? != null)
            ll = (long)n;//doesnt get here.
        if (l as int? != null)
            ii = (int)l;//doesnt get here
        if (l as long? != null)
            ll = (long)l;//doesnt get here
        //geez. What is more stange is (int) will work while (int?) will not
        int? ni = (int?)n;//cast exception
        int iii = (int)n; //works
        ll = (long)n;
Теги:
object
enums

3 ответа

5
Лучший ответ

Объяснение

if (n is int)
        ii = (int)n;//doesnt get here.
    if (n is long)
        ll = (long)n;//doesnt get here.
    if (l is int)
        ii = (int)l;//doesnt get here
    if (l is long)
        ll = (long)l;//doesnt get here

n и l не является ни int/long, ни long?/int?, они имеют тип вашего перечисления, поэтому это ожидаемое поведение.

Решение

Вероятно, вы должны использовать класс Convert для достижения того, что вы хотите.

6
long test1 = Convert.ToInt64(l); // 4294967296
long test2 = Convert.ToInt64(n); // 25
  • 0
    Convert.ToInt64 выдаст исключение. Как насчет метода Int64.TryParse
  • 0
    аааа, мне интересно, что делает класс convert за кулисами. Надеюсь, не нормальный бросок внутри блока try. Но это имело бы смысл. -Edit- ThinkJet ответил на это. Я могу догадаться, что может сделать ChangeType.
Показать ещё 1 комментарий
3

Пример из MSDN:

static object GetAsUnderlyingType(Enum enval)
{
    Type entype = enval.GetType();

    Type undertype = Enum.GetUnderlyingType(entype);

    return Convert.ChangeType( enval, undertype );
}
  • Преобразовать в базовый тип (int или long)
  • Передать преобразованное значение в вашу переменную (я думаю, просто присвойте результат длинной переменной).
  • 0
    Это будет довольно медленно, но это то, что я тоже использую. (Если я не могу помочь себе иначе)
  • 0
    Отличный ответ!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню