среда, 6 июня 2012 г.

.NET C# - Typesafe Enum Pattern

Недавно понадобилось сделать перечисление со строками. Перечисления в .NET поддерживают только численные типы (byte, sbyte, short, ushort, int, uint, long, ulong) но к сожалению не поддерживают конструкцию типа
enum ImagePath : string
{
    BIcon = "Images/BIcon.jpg",
    PIcon = "Images/PIcon.jpg",
    GIcon = "Images/GIcon.jpg"
}
Но выход есть!
На помощь пришел Typesafe Enum паттерн. Одна из его возможных реализаций приведена ниже.
public sealed class ImagePath
{
    private string _path;

    // Выносим путь "Images/" в отдельное поле
    private const string _PathToImage = "Images/";

    public static readonly ImagePath BIcon = new ImagePath(_PathToImage + "BIcon.jpg");
    public static readonly ImagePath PIcon = new ImagePath(_PathToImage + "PIcon.jpg");
    public static readonly ImagePath GIcon = new ImagePath(_PathToImage + "GIcon.jpg");

    private ImagePath(string path)
    {
        _path = path;
    }

    public override string ToString()
    {
        return _path;
    }
}
Создаем запечатанный класс, на каждое значение перечисления создаем статическое, только для чтения, поле, которое инициализируем в приватном конструкторе (чтобы не было возможности из вне создавать экземпляр этого класса). В добавок перегружаем метод ToString(), чтобы при вызове ImagePath.BIcon он корректно преобразовал нужное нам значение.

Комментариев нет:

Отправить комментарий