[英]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.