относиться к Enum как к универсальному? - PullRequest
2 голосов
/ 15 февраля 2012

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

public enum ABC {
    One, 
    Two,
    Three
}

public enum DEF {
    Four,
    Five,
    Six
}

и я хочу написать метод, который принимает Enum в качестве параметра и просто возвращает имя перечисления следующим образом:

public string GetEnumName(Enum anEnum) {
    return anEnum.GetType().Name;
}

но если я назову это как GetEnumName(DEF); Я получаю сообщение об ошибке «тип используется как переменная». Есть идеи? спасибо

РЕДАКТИРОВАТЬ Извините, судя по ответам, возможно, я не был достаточно ясен. Я просто выбрал GetEnumName в качестве очень упрощенного примера, чтобы проиллюстрировать проблему, а не как получить имя из типа. По сути, я хочу метод, которому я могу передать ЛЮБОЕ перечисление и заставить его воздействовать непосредственно на это перечисление, спасибо

Ответы [ 6 ]

3 голосов
/ 15 февраля 2012

Использование:

public static string GetTypeName<T>()
{
    return typeof(T).Name;
}

Использование:

var result = GetTypeName<DEF>();
1 голос
/ 15 февраля 2012

То, что вы хотите написать, выглядит примерно так:

public string GetEnumName<T>() where T : Enum
{
    return typeof(T).Name;
}

То есть универсальный метод с ограничением параметра типа.

К сожалению, нет способа определить такойограничение для перечислений в C # (также нельзя определить одно для делегатов).Люди обычно выбирают решение, упомянутое @ ananthonline.

На самом деле такое ограничение не поддерживается языком C #, но поддерживается на уровне CLR.Например, использование такого инструмента, как Mono.Cecil , может помочь вам изменить сборку и применить ограничение к методу после его компиляции.

Ознакомьтесь с этой статьей: Ограничивающие общие ограничения

Вы найдете инструмент, который облегчает процесс применения не поддерживаемых C # ограничений параметров общего типа: Исправление ограничений Cecil

И не забывайте, что в классе Enum есть много полезных статических методов, если вы хотите работать с именами и значениями ваших перечислений members .

1 голос
/ 15 февраля 2012

Возможно, это поможет?

public static class EnumExtensions
{
    public static string GetEnumName<T>(this T value) where T : struct
    {
        var type = typeof(T);
        if (!type.IsEnum)
            throw new InvalidOperationException(string.Format("{0} is not an enum", type));
        return type.GetEnumName(value);
    }
}
1 голос
/ 15 февраля 2012

Ваша проблема в том, что вы передаете тип вместо System.Type. Измените свой метод на это:

public string GetEnumName(Type enumType) {
    return enumType.Name;
}
0 голосов
/ 15 февраля 2012

Вы не можете. Общие ограничения не допускаются для типов enum (включая System.Enum). Вместо этого используйте Enum.GetName .

0 голосов
/ 15 февраля 2012

Просто введите тип:

public string GetEnumName(Type enumType)
{
    return enumType.Name;
}

А

GetEnumName(typeof(ABC));

На этом этапе, если ваш метод больше ничего не делает, вы, возможно, просто используете вместо него typeof(ABC).Name.

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