静态颜色类型初始化程序扩展方法

时间:2016-03-20 13:11:57

标签: c# colors static extension-methods

我想为System.Windows.Media.Color创建一个扩展方法。

该方法应该从HSV值创建Color实例,而不必先手动创建新的实例。但目前我的代码完全覆盖 Color类。

如果我将它添加为普通的ExtensionMethod,我可以像这样使用它:

var color = new Color().FromHSV(1, 1, 250);

但我想以这种方式使用它:

var color = Color.FromHSV(1, 1, 250);

这是我到目前为止所做的(但覆盖了完整的现有Color类):

namespace System.Windows.Media
{
    public class Color
    {
        public static Color FromHSV(double hue, double saturation, double value)
        {
            int hi = (byte)(Math.Floor(hue / 60)) % 6;
            double f = hue / 60 - Math.Floor(hue / 60);

            value = value * 255;
            byte v = (byte)value;
            byte p = (byte)(value * (1 - saturation));
            byte q = (byte)(value * (1 - f * saturation));
            byte t = (byte)(value * (1 - (1 - f) * saturation));

            if (hi == 0)
                return Color.FromArgb(255, v, t, p);
            else if (hi == 1)
                return Color.FromArgb(255, q, v, p);
            else if (hi == 2)
                return Color.FromArgb(255, p, v, t);
            else if (hi == 3)
                return Color.FromArgb(255, p, q, v);
            else if (hi == 4)
                return Color.FromArgb(255, t, p, v);
            else
                return Color.FromArgb(255, v, p, q);
        }
    }
}

4 个答案:

答案 0 :(得分:1)

您无法创建像静态方法一样的扩展方法。只允许在实例上调用扩展方法。

答案 1 :(得分:1)

正如其他一些海报所说,你不能完全按照自己的意愿去做。为什么不从不同角度处理问题?

var colour = HSV.CreateColor(1, 1, 250);

声明为:

public static class HSV
{
    public static Color CreateColor(double hue, double saturation, double value)
    {
        Color color = new Color();
        // Do HSV things..
        return color;
    }
}

答案 2 :(得分:0)

不,那是不可能的。还有一些其他选择;

  • 创建一个包含ColorHelper的包装器,其中包含所有扩展名。用法类似于ColorHelper.FromHSV()
  • 使用不同的名称空间。

第二点的例子:

using WMC = System.Windows.Media.Color;
using MyColorNamespace;

public class Program
{
    public void Foo()
    {
         var bar = WMC.ColorMethod();
         var bar2 = MyColorNamespace.FromHSV(0,0,0);
    }
}

答案 3 :(得分:0)

您的代码感觉不像是一种扩展方法..

因为扩展方法必须是静态类中的静态方法,并且第一个参数必须是要扩展的对象。

像这样:

 namespace ExtensionMethods
    {
        public static class MyExtensions
        {
            public static int WordCount(this String str)
            {
                return str.Split(new char[] { ' ', '.', '?' }, 
                                 StringSplitOptions.RemoveEmptyEntries).Length;
            }
        }   
    }