C# Enum.GetValues ​​() - использование не коробочного объекта

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

    public static string GetMarkup(Type enumType)
    {
        StringBuilder builder = new StringBuilder();
        foreach (var val in Enum.GetValues(enumType))
        {
            builder.Append(val.ToString());
        }
        return builder.ToString();
    }

Метод вызывается так, где CopyType является перечислением:

    GetDropDownListHtml(typeof(CopyType))

Цель состоит в том, чтобы иметь возможность вызывать методы расширения ToString(), которые я написал для перечислений, которые я передам в этот метод. Проблема в том, что для того, чтобы сделать метод общим, мне нужно использовать var объявить мою переменную в объявлении foreach, но это ее заполняет. Вместо перечисления CopyType у меня есть объект CopyType в штучной упаковке.

В ответ я перепробовал многие мысли вот так, но безрезультатно

    ((typeof(enumType))val.ToString()

Есть идеи?

1 ответ

Решение

Нет способа использовать методы расширения, чтобы сделать это для определенного перечисления. Вам нужно либо расширить свой метод расширения, чтобы поддерживать все Enum типы, добавить is там есть оператор, который вы можете использовать для приведения его только при необходимости, или написать специальную перегрузку для этой функции, которую вы вызываете только для этого типа перечисления. Это связано с тем, как на самом деле реализованы методы расширения.

Компилятор превращает метод расширения в его статическую форму: myCopyType.ToString() становится CopyType.ToString(myCopyType) когда скомпилировано. Но с вашим сценарием (или даже с генериками) компилятор не может сказать, какой тип использовать, потому что тип не определяется до времени выполнения.

Это оставляет три варианта выше.

В своем собственном коде я выбрал первый вариант, основанный на приведенном здесь коде. Вы сможете позвонить .GetLabel() на любом Enum типа, и вы можете поставить свои специальные ярлыки на этом конкретно.

Кроме того, вам нужно будет использовать foreach (Enum val in ... вместо этого, чтобы убедиться, что компилятор знает, что это Enum,

Другие вопросы по тегам