簡體   English   中英

如何將擴展方法與此和params關鍵字結合?

[英]How to combine extension method's this with params keyword?

我想寫一個擴展方法:

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)

但是該方法的簽名無效,請在參數導致錯誤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之前使用它是沒有意義的。 我試圖避免鍵入包含該方法的類的名稱, 但這 不是解決該問題的方法。

考慮為該類提供一個有用的,有點特定的名稱,以得到如下所示的漂亮語法:

KeyPressed.Any(Key.LeftShift, Key.RightShift);

由實施

public static class KeyPressed
{
    public static bool Any(params System.Windows.Input.Key[] keys)
    {
        ....
    }
}

好吧,這並不能真正回答您的問題,但仍然可能是有用的解決方案。

會將方法添加到其在簽名中使用的類型,在沒有意義的參數之前使用它。

並不是要節省您鍵入包含該方法的類的名稱。

您正在尋找的被稱為“使用靜態”,它像命名空間的常規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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM