unity游戏引擎- c#:从枚举到类的自动转换

本文关键字:转换 枚举 引擎 游戏 unity | 更新日期: 2023-09-27 18:01:49

考虑这个场景。

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

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

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

我真的不关心ColorCode是什么(enum, class,无论什么),只要上面的行工作。

问题:

c#不允许为枚举定义操作符。我也没有任何宏来在ColorCode中制作一些很好的人类可读的表。

限制

:

ColorCode的内容应该可以作为int s使用,但是应该可以分配/转换到Color


代码片段:

public enum ColorCode{
    AliceBlue = 0xF0F8FF,
    AntiqueWhite = 0xFAEBD7,
    Aqua = 0x00FFFF,
    Aquamarine = 0x7FFFD4,
    Azure = 0xF0FFFF,  ///Repeat 140 times
    ...
}
public static Color colorFromCode(ColorCode code){
 ....
}

unity游戏引擎- c#:从枚举到类的自动转换

可以在enum上编写扩展方法:

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

那么你可以:

Color tmp = ColorCode.Aqua.ToColor();

这不是一个隐式转换,但它是你可能得到的可读的。

您可以将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)。此时,您可以轻松地隐式地将ColorCode s转换为Color s:

Color tmp = ColorCode.Aqua;