静态颜色类型初始值设定项扩展方法
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;
}
}
我想为 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;
}
}