Метод расширения или подкласс для создания System.Drawing.Color на основе другого цвета и альфа?

Я хочу создать цвета в C# (не XAML), используя одну из следующих идиом:

Color transparentblue = TransparentColor(Brushes.Blue, 0.5); // 0.5 => 128
Color transparentblue = Brushes.Blue.SetAlpha(0.5);  // again, 0.5 => 128

Я хочу избавиться от Color.FromArgb() синтаксис, который не является дружественным для дизайнера вообще. Я также заставил его работать со статическим методом внутри статического класса, но написание стало немного тяжелым:

public static class ColorGenerators {        
    public static Color GetTransparentColor (Color color, double opacity) {
        byte op = (byte)(opacity*255);

        return Color.FromArgb(op, color.R, color.G, color.B);
    }
}

// To be used as
var transparentblue = ColorGenerators.GetTransparentColor(Color.Blue, 0.5);

Я все еще предпочел бы подход "Метод расширения", и мне кажется, что скоро наша компания выиграет от методов, подобных тем, которые описаны в этом вопросе, поэтому мне интересно, как они будут выглядеть (учитывая, что Color является структурой, а не классом).

1 ответ

Решение

Как насчет чего-то вроде этого:

public static class ColorExtensions
{        
    public static Color WithAlpha(this Color color, double opacity) 
    {
        byte op = (byte)(opacity*255);
        return Color.FromArgb(op, color.R, color.G, color.B);
    }
}

Ключ является this Ключевое слово в первом параметре. Это (а также быть static метод в static class) указывает компилятору, что это метод расширения.

Color transparentblue = Color.Blue.WithAlpha(0.5);

Дальнейшее чтение

Другие вопросы по тегам