2015-07-09 7 views
3

Рассмотрите этот сценарий.C#: автоматическое преобразование из enum в класс

  1. Существует structColor (написан кем-то еще)
  2. Существует enum ColorCode, который реализует HTML имени цветовые коды.
  3. Там есть статическая функция, которая преобразует ColorCode в Color
  4. Я хочу быть в состоянии сделать это:

    Color tmp = ....; 
    tmp = ColorCode.Aqua; 
    

Как я могу это сделать без копирования вставки текста в 140 раз?

Мне все равно, что ColorCode is (enum, class, whatever), если эта линия работает.

Проблема:

C# не позволяет мне определить операторы перечислений. У меня также нет макросов, чтобы сделать приятную человеко-читаемую таблицу в пределах ColorCode.

Ограничение:

ColorCode Содержание должно быть доступно как int с, но должно быть назначаемыми/конвертируемые в Color.


Кодовые фрагменты:

public enum ColorCode{ 
    AliceBlue = 0xF0F8FF, 
    AntiqueWhite = 0xFAEBD7, 
    Aqua = 0x00FFFF, 
    Aquamarine = 0x7FFFD4, 
    Azure = 0xF0FFFF, ///Repeat 140 times 
    ... 
} 

public static Color colorFromCode(ColorCode code){ 
.... 
} 

ответ

10

Вы могли бы написать метод расширения перечисления:

public static Color ToColor(this ColorCode colorCode) 
{ 
    ... 
} 

Тогда вы могли бы:

Color tmp = ColorCode.Aqua.ToColor(); 

Это не совсем неявное преобразование, но оно так же читаемо, как вы, вероятно, получите.

2

Вы можете сделать ColorCode на структуру (лучше, чем класс, потому что на самом деле это просто значение), а затем определить неявное приведение от ColorCode к Color:

struct ColorCode 
{ 
    int hex; 
    public static readonly ColorCode 
     AliceBlue = 0xF0F8FF, 
     AntiqueWhite = 0xFAEBD7; 
    // and the rest of the ColorCodes 

    public static implicit operator Color(ColorCode cc) 
    { 
     return /* cc converted to a Color */; 
    } 
    public static implicit operator ColorCode(int cc) 
    { 
     return new ColorCode() { hex = cc }; 
    } 
} 

неявной гипсе из int в Color просто позволяет упростить определения для ваших названных цветовых кодов (чтобы вы могли делать, например, AliceBlue = 0xF0F8FF). На данный момент, вы можете легко и неявно преобразовать ColorCode с до Color с:

Color tmp = ColorCode.Aqua; 
+0

Спасибо за ответив. Ваше предложение тоже хорошее, но, к сожалению, я не могу сразу принять два ответа, и на данный момент я пошел с предложением Джона Скита. Тем не менее, спасибо за эту идею. – SigTerm