Помощь с методами расширения Enum - PullRequest
2 голосов
/ 16 февраля 2011

У меня есть enum вспомогательный общий класс, где у меня есть метод EnumDescription() Чтобы назвать это, я должен идти так EnumHelper<Enumtype>.EnumDescription(value) Я хочу реализовать enum метод расширения EnumDescription(this Enum value), основанный на моем вспомогательном методе enum EnumHelper<T>.EnumDescription(value)

Есть одна вещь, с которой я застрял. Вот мой код:

public static string EnumDescription(this Enum value)
{
    Type type = value.GetType();

    return EnumHelper<type>.EnumDescription(value); //Error here
}

Я получаю ошибку The type or namespace name 'type' could not be found (are you missing a using directive or an assembly reference?)

Могу ли я что-нибудь сделать, чтобы это сработало?

Ответы [ 2 ]

3 голосов
/ 16 февраля 2011

Два варианта, которые я могу придумать (может быть больше).

Первый вариант: сделать метод расширения универсальным. C # не допускает enum в качестве общего ограничения, а это значит, что вам потребуется проверка во время выполнения, чтобы убедиться, что тип на самом деле enum.

public static string EnumDescription<T>(this T value)
    where T : struct, IComparable, IConvertible, IFormattable
{
    if (!typeof(T).IsEnum)
        throw new InvalidOperationException("Type argument T must be an enum.");

    return EnumHelper<T>.EnumDescription(value);
}

Второй вариант: использовать отражение. Это будет медленно (er), хотя вы можете создать делегата из MethodInfo и кэшировать его для повторного использования в Dictionary<Type, Delegate> или аналогичном. Таким образом, вы будете нести затраты на рефлексию только при первом обнаружении этого типа.

public static string EnumDescription(this Enum value)
{
    Type t = value.GetType();
    Type g = typeof(EnumHelper<>).MakeGenericType(t);
    MethodInfo mi = g.GetMethod("EnumDescription");
    return (string)mi.Invoke(null, new object[] { value });
}
1 голос
/ 16 февраля 2011

Обобщение выполняется во время компиляции.

Вы можете изменить свой метод на универсальный метод where T : struct или вызвать внутренний метод с помощью Reflection.

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