我想为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);
}
}
}
答案 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;
}
}
}