【发布时间】:2019-02-28 21:37:06
【问题描述】:
我想写一个扩展方法:
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:“A parameter array cannot be used with 'this' modifier on an extension method”。
我目前的解决方法是
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 的好处,同时避免在签名中重复参数类型?
(一种)解决方案
cmets 让我意识到我在误用 this。由于 this 是作为方法添加到签名中它前面的类型的,因此在 params 之前使用它是无稽之谈。 我试图避免输入包含该方法的类的名称,this 不是解决该问题的方法。
【问题讨论】:
-
我不认为扩展方法是您正在寻找的。当然,您列出的调用语法与它们的预期用途不同(扩展方法被设计为看起来像您调用的单个实例的“扩展”,如实例方法)。您可能只想要一个带有辅助方法的辅助类。
-
如果您仍然像常规静态方法一样调用该方法,那么
this毫无意义。要从this中受益,您必须将其称为Key.LeftShift.IsKeyPressedAny( ... )。因此,请重新考虑您是否真的需要this。 -
docs.microsoft.com/en-us/dotnet/csharp/misc/cs1104 有帮助吗?如果删除
this会发生什么? -
@mjwills 这不是我想要的。我想写“namespace_name.method_name”而不是“namespace_name.helper_class_name.method_name”。据我了解,使用 static namespace_name.helper_class_name 不允许这样做。
标签: c#