Невозможно преобразовать тип 'System.Enum' в int - PullRequest
23 голосов
/ 29 октября 2009

(ОК, я покажу здесь глубины моего невежества, пожалуйста, будьте осторожны)

Фон

У меня есть метод, который выглядит (немного) так:

public void AddLink(Enum enumVal)
{
     string identifier = m_EnumInterpreter(enumVal);
     AddLink(identifier);
}

EnumInterpreter - это Func , который передается при создании родительского класса.

Я использую Enum, потому что на этом уровне это «не мое дело» - мне все равно, какой это конкретный enum. Вызывающий код просто использует (сгенерированный) перечисление, чтобы избежать магических строк.

Вопрос

Если EnumInterpreter отправляет обратно пустую строку, я хотел бы вызвать исключение с фактическим значением enumVal. Я думал, что смогу привести к int, но у компилятора его не будет. Что я делаю неправильно? (Пожалуйста, не говорите «все»).

Ответы [ 7 ]

39 голосов
/ 29 октября 2009

System.Enum не может быть напрямую приведен к Integer, но он явно реализует IConvertible, то есть вы можете использовать следующее:

public void AddLink(Enum enumVal)
{
    string identifier = m_EnumInterpreter(Convert.ToInt32(enumVal));
    AddLink(identifier);
}

Имейте в виду, что если ваш Enum на самом деле использует что-то отличное от Integer (например, число с плавающей точкой), вы потеряете нецелые данные при конвертации. Или, очевидно, замените вызов Convert тем, из чего вы конвертируете (если он известен)

5 голосов
/ 29 октября 2009

Нет, вы не можете привести его к типу int, поскольку System.Enum не является перечислением, это просто базовый класс для перечислений.

EDIT:

Вы можете получить значение следующим образом, но оно ужасно:

int intVar = (int)enuYourEnum.GetType().GetField("value__").GetValue(objYourEnum);
4 голосов
/ 02 июня 2010

попробуйте это ..

m_EnumInterpreter ((int) (object) enumVal);

1 голос
/ 29 октября 2009

Я не знаю, включить ли это в мой вопрос или как ответ. Проблема в том, что это не ответ, а ответ, который работает для меня.

То, что я случайно обнаружил при попытке чего-то другого, это то, что если я просто втираю это в конец строки, я получаю то, что хочу:

throw new Exception("EnumInterpreter returns empty string for enumVal=" + enumVal);
//EnumInterpreter returns empty string for enumVal=3720116125

Я фактически упростил до int в моем вопросе, реальный тип данных - это uint (в данном конкретном случае). К счастью, учитывая, что я на самом деле хотел только строку, мне не нужно об этом беспокоиться.

Я не уверен, какой из трех других ответов является «правильным», так что проголосуйте ...

1 голос
/ 29 октября 2009

Разные вещи здесь:

1) ответ Райана выглядит хорошо, но ... я бы предпочел передать Enum интерпретатору enum, чтобы вы могли сделать весь Convert.To ... там. Если вы знаете, что используете ТОЛЬКО целочисленные перечисления, то Convert.ToInt32 () подойдет. В противном случае вы можете захотеть добавить с помощью отражения или попробовать / поймать другие преобразования.

2) Вы также можете рассмотреть возможность использования членов класса Enum, таких как .GetName (), .GetValue () и т. Д., Поскольку они имеют дело непосредственно с определенными именами и значениями, независимыми от типа enum.

3) технически я бы не выбросил исключение за пределы интерпретатора enum. Если это условие в общем случае верно, выведите исключение изнутри интерпретатора enum, чтобы все виды использования класса получили пользу от проверки. Или вы можете в конечном итоге дублировать код.

4) Судя по названию вашей переменной, у вас есть опыт работы с C ++ / MFC. Возможно, вы захотите войти в соглашения об именах в стиле C #, это облегчит вашу жизнь при использовании / чтении кода и библиотек других людей. Проверьте MS StyleCop для хорошего дополнения, чтобы помочь с именами.

0 голосов
/ 08 апреля 2014

Я понимаю, что это, вероятно, не решение вашей конкретной проблемы, но я просто хочу опубликовать, как я решил эту проблему для конкретного API, который я использовал.

int result = (int) (ActualEnumType) MethodThatReturnsSystemEnumType( arg1, arg2 );

Надеюсь, это кому-нибудь поможет. Двойной отлив FTW.

0 голосов
/ 30 октября 2009

Почему бы не проанализировать перечисление в строку и вернуть фактическое значение перечисления?

public enum MyEnum { Flower = 1, Tree = 2, Animal = 3 };

string name = MyEnum.Flower.ToString(); // returns "Flower"

Я думаю, .ToString() устарела, и я не уверен в новом способе сделать это. Я бы подумал, что фактическое представление enum будет более полезным, чем int?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...