Методы расширения и перечисления - PullRequest
0 голосов
/ 01 июля 2011

У меня есть Enum

Public Enum MyEnum
    <StringValue("Bla Bla")> _
    BlaBla

    <StringValue("bbble bbble")> _
    BleBle
End Enum

Я сделал метод расширения (GetStringValue), который принимает Enum и возвращает значение StringValueAttribute, если оно есть.

я могу сделать Dim sValue = MyEnum.BlaBla.GetStringValue()

Теперь мне нужен метод "extension", который возвращает мне все значения Enum в виде списка строк.

Я хочу применить это так: MyEnum.GetStringValues()

Возможно ли это?

Ответы [ 2 ]

3 голосов
/ 01 июля 2011

Хотя вы не можете добавить метод статического расширения к типу, вы можете объявить новый класс следующим образом:

class EnumHelper
{
    public static IEnumerable<string> GetStringValues<TEnum>()
        where TEnum : struct, IComparable, IFormattable, IConvertible
    {
        var enumType = typeof(TEnum);

        if (!enumType.IsEnum) {
            throw new ArgumentException("T must be an enumerated type");
        }

        foreach (Enum item in Enum.GetValues(enumType))
        {
            yield return item.GetStringValue();
        }
    }
}

и вызвать его следующим образом:

class Program
{
    enum Rainbow { Red, Orange, Yellow, Green, Blue, Indigo, Violet }

    static void Main(string[] args)
    {
        foreach (var item in EnumHelper.GetStringValues<Rainbow>())
        {
            Console.WriteLine(item);

        }

        Console.ReadKey(false);
    }
}
2 голосов
/ 01 июля 2011

Возможно ли это?

Нет. Вы можете добавлять методы расширения к экземплярам определенных типов, но не к самим конкретным типам.

Вот один способ подумать об этом: методы расширения являются просто синтаксическим сахаром для статических методов в статических классах, где первый параметр метода является «получателем» метода расширения. Можно ли написать статический метод для статического класса, у которого первый параметр имеет что-то , например MyEnum? Нет. Вы не можете передавать имена типов в качестве параметров для методов (вы можете передавать экземпляры дескрипторов типов (например, typeof(MyEnum)), но не само имя типа). Таким образом, то, что вы спрашиваете, невозможно.

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