динамическое приведение типов в нескольких сборках - PullRequest
0 голосов
/ 28 декабря 2011

В моей программе я использую перечисления для представления текущего состояния объекта.Я хотел бы иметь возможность циклически перебирать значения этого перечисления по одному.Тот факт, что значения перечисления являются числовыми последовательными и начинаются с 0, является данным.

При попытке написать функцию, которая увеличивает перечисление, цикл, если он достиг конца, привел к проблеме.1004 *

Если метод IncrWrap существует в той же сборке (проекте), что и объект, который его вызывает, он работает отлично.Однако, если я перенесу его в другой проект (выше, чтобы его могли использовать другие люди) и вызову его из библиотеки DLL, я получу RuntimeBinderException, когда он попытается привести wrapper к int ссообщение "Невозможно преобразовать тип 'System.Enum' в 'int'".

Что происходит?Я не понимаю, почему вызов функции из другой сборки может привести к тому, что она будет вести себя по-другому.Что-то в dynamic я не понимаю?Было бы неплохо не использовать рефлексию для этого.

1 Ответ

1 голос
/ 28 декабря 2011

К сожалению, перечисления создают некоторые проблемы здесь. Прежде всего перечисление может иметь любой целочисленный тип, кроме char. Во-вторых, нет никакой гарантии, что перечисления имеют постепенно увеличивающиеся значения базового типа. Наконец, язык C # не поддерживает ограничения общего типа System.Enum, что было бы несколько полезно. Учитывая все вышесказанное, я считаю, что вы можете решить свою проблему немного по-другому:

public static TEnum NextEnum<TEnum>(TEnum value)
{
    if (!typeof(TEnum).IsEnum)
        throw new ArgumentException("Expected type of System.Enum", "value");

    var values = Enum.GetValues(typeof (TEnum));
    var index = Array.IndexOf(values, value);
    return (TEnum)Enum.ToObject(typeof (TEnum), values.GetValue((index + 1) % values.Length));
}

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

...