我想写一个扩展方法:
static public bool IsKeyPressedAny(this params System.Windows.Input.Key[] keys)
{
foreach (var key in keys)
{
if (System.Windows.Input.Keyboard.IsKeyDown(k))
{
return true;
}
}
return false;
}
要像这样使用
IsKeyPressedAny(Key.LeftShift, Key.RightShift);
或
IsKeyPressedAny(Key.a)
但是方法的签名无效,在 params 之前添加 this 会导致错误CS1104:“参数数组不能与扩展方法的'this'修饰符一起使用”。
我当前的解决方法是
static public bool IsKeyPressedAny(
this System.Windows.Input.Key key
, params System.Windows.Input.Key[] keys
)
{
if (System.Windows.Input.Keyboard.IsKeyDown(key)) return true;
foreach (var k in keys)
{
if (System.Windows.Input.Keyboard.IsKeyDown(k))
{
return true;
}
}
return false;
}
让我有些笨拙。有没有一种方法可以保留使用 params 的好处,同时又避免了签名中参数类型的重复?
这些评论使我意识到我误用了 this 。由于 this 是作为方法添加到签名中所使用的类型的,因此请在 params 废话之前使用它。 我试图避免键入包含方法的类的名称,而 this 不是不是解决问题的方法。
答案 0 :(得分:3)
考虑为该类提供一个有用的,有点特定的名称,以获得类似这样的漂亮语法:
KeyPressed.Any(Key.LeftShift, Key.RightShift);
由
实施public static class KeyPressed
{
public static bool Any(params System.Windows.Input.Key[] keys)
{
....
}
}
嗯,这并不能真正回答您的问题,但仍然可能是有用的解决方案。
答案 1 :(得分:2)
此将方法添加到其在签名中使用的类型,在没有意义的params之前使用它。
此并不是要节省您键入包含该方法的类的名称。
答案 2 :(得分:-1)
您要查找的内容称为“使用静态”,它可以像命名空间的常规using
指令那样导入内容:
using static YourNameSpace.KeyHelpers;
将允许您仅使用其名称来调用YourNameSpace.KeyHelpers.IsKeyPressedAny
,而无需使用类名:
IsKeyPressedAny(Key.LeftShift, Key.RightShift);
示例:
public static class KeyHelpers
{
public static bool IsKeyPressedAny(params System.Windows.Input.Key[] keys)
{
foreach (var key in keys)
{
if (System.Windows.Input.Keyboard.IsKeyDown(k))
{
return true;
}
}
return false;
}
}