Есть ли способ сделать пользовательское преобразование для класса, в который я не могу написать код? - PullRequest
0 голосов
/ 07 февраля 2019

Итак, у меня есть два класса, предоставляемые MonoGame: Color и Vector4.Эти два класса можно интерпретировать как одно и то же: Vector4 может хранить значения 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 голосов
/ 20 февраля 2019

Класс Color MonoGame уже содержит метод экземпляра .ToVector4().

См. Color.cs в исходном файле MonoGame.Он возвращает Vector4, каждое из значений которого находится в диапазоне от 0 до 1.

Обратное отключение Vector4 to Color обеспечивается конструктором Color, который принимает Vector4 в качестве единственного аргумента.

Это значение может быть напрямую передано в функции шейдера.

Я понимаю, что вы искали явное приведение для этого.

Это довольно простой процесс:

  1. Загрузите исходный код MonoGame, используя git .
  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 как часть вашего решения и добавить его в список ссылок вашего проекта (при удалении существующих ссылок MonoGame).

  4. Скопируйте Framework-библиотеки поверх существующих вВаш целевой каталог.

  5. Перестройте свой проект.В некоторых случаях вам может потребоваться повторить шаг 4.

0 голосов
/ 07 февраля 2019

Самое близкое, что вы можете получить - это метод расширения для каждого типа, который вы хотите преобразовать.

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.

...