【问题标题】:C#: automatic conversion from enum to classC#:从枚举到类的自动转换
【发布时间】:2015-07-09 17:30:38
【问题描述】:

考虑这种情况。

  1. 有一个structColor(别人写的)
  2. enum ColorCode 实现了 html 命名颜色代码。
  3. 有一个静态函数可以将ColorCode 转换为Color
  4. 我希望能够做到这一点:

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

如何在不复制粘贴文本 140 次的情况下做到这一点?

我真的不在乎ColorCode 是什么(枚举、类等),只要上面的行有效。

问题:

C# 不允许我为枚举定义运算符。 我也没有任何宏可以在ColorCode 中制作一些漂亮的人类可读表格。

限制

ColorCode 的内容应以ints 的形式提供,但应可分配/可转换为Color


代码片段:

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

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

【问题讨论】:

    标签: c# unity3d enums


    【解决方案1】:

    你可以在枚举上写一个扩展方法:

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

    那么你可以:

    Color tmp = ColorCode.Aqua.ToColor();
    

    这不是一个隐式转换,但它的可读性与您可能得到的一样。

    【讨论】:

      【解决方案2】:

      您可以将ColorCode 设为结构(比类更好,因为它实际上只是一个值),然后定义从ColorCodeColor 的隐式转换:

      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 };
          }
      }
      

      intColor 的隐式转换只是为了使命名颜色代码的定义更容易(以便您可以这样做,例如AliceBlue = 0xF0F8FF)。此时,您可以轻松隐式地将ColorCodes 转换为Colors:

      Color tmp = ColorCode.Aqua;
      

      【讨论】:

      • 感谢您的回复。你的建议也很好,但遗憾的是我不能同时接受两个答案,我暂时接受了 john skeet 的建议。不过,感谢您的想法。
      猜你喜欢
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 2020-08-21
      相关资源
      最近更新 更多