如何将扩展方法与此和params关键字结合?

时间:2018-09-25 09:45:50

标签: c#

我想写一个扩展方法:

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 不是不是解决问题的方法。

3 个答案:

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