静态颜色类型初始值设定项扩展方法

Static color type initializer extension method

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

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

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

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

但我想这样使用它:

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

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

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);
        }
    }
}

您不能创建行为类似于静态方法的扩展方法。扩展方法只允许在实例上调用。

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

  • 创建一个包装器,类似于 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);
    }
}

您的代码不像扩展方法..

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

像这样:

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

正如其他一些发帖者所说,您无法完全按照自己的意愿进行操作。为什么不换个角度解决问题呢?

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;
    }
}