有没有办法对我无法编写代码的类进行用户定义的转换?

时间:2019-02-06 22:09:11

标签: c# monogame

所以我有MonoGame提供的两个类:Color和Vector4。这两个类可以解释为同一事物:Vector4可以存储Color的值R,G,B和A。我正在尝试编写一个隐式(如果需要,也可以使用显式)转换运算符,以从Color转换为Vector4。不用写MonoGame的源代码怎么办?

尝试在不相关的类中定义一个将导致令人恐惧的“用户定义的转换必须转换为封闭类型或从封闭类型转换”,并且在名称空间本身(而不是类)中进行转换会导致更可怕的错误。

这是我要潜入某个地方的一个示例:

public static explicit operator Vector4(Color color)
{
    return new Vector4(color.R, color.G, color.B, color.A);
}

我将如何潜入上述代码?如果不可能,是否有解决方法?

2 个答案:

答案 0 :(得分:3)

最可能获得的是每种要转换类型的扩展方法。

public static class Extensions
{
    public Vector4 ToVector4(this Color color)
    {
        return //do conversion to vector4
    }

    public Color ToColor(this Vector4 vector)
    {
        return //do conversion to Color
    }
}

那并不是所有的Vector4都可能代表@Camilo Terevinto指出的颜色。

答案 1 :(得分:0)

MonoGame的Color类已经包含一个.ToVector4()实例方法。

请参见MonoGame源git中的Color.cs。 它返回一个Vector4,其值在0到1之间。

返回行程Vector4 to ColorColor构造函数提供,该构造函数将Vector4作为其唯一参数。

该值可以直接传递给着色器函数。

我知道您正在为此寻求明确的演员表。

这是一个非常简单的过程:

  1. 使用git下载MonoGame源代码。
  2. 在MonoGame.Framework / Color.cs的类中添加以下行

    public static explicit operator Vector4(Color color)
    {
       return new Vector4(color.R / 255f, color.G / 255f, color.B / 255f, color.A / 255f);
    }
    
  3. 为每个目标平台编译框架。

    如果您使用的是Visual Studio,则将MonoGame项目作为解决方案的一部分包含在其中,然后将其添加到项目的References(同时删除现有的MonoGame References)会更容易。

  4. 将Framework Dll复制到目标目录中现有的Dll上。

  5. 重建项目。在某些情况下,您可能必须重复步骤4。