我有以下伪代码可用:
KeyBindings[Keys.Right] += Method1;
KeyBindings[Keys.Right] += Method2;
我遇到的问题是我希望能够做到这一点:
KeyBindings[Keys.Right] += Method1(argument);
KeyBindings[Keys.Right] += Method2(argument1, argument 2);
这可能吗?如果是这样,我如何重写我的代码来实现这一目标?
KeyBindings定义为:
Dictionary<Keys, Action> KeyBindings = new Dictionary<Keys, Action>();
答案 0 :(得分:3)
class Program {
public static void Main() {
Dictionary<ConsoleKey, Action> KeyBindings = new Dictionary<ConsoleKey, Action>();
KeyBindings[ConsoleKey.A] = null;
KeyBindings[ConsoleKey.A] += () => Method1(12);
}
static void Method1(int arg) {
}
}
答案 1 :(得分:3)
一般来说,如果你想创建一个代理,它会接受一些现有的函数并应用一组预设的参数,你需要将该函数包装在另一个中。
如,
考虑函数Foo()
,它接受一个string
参数并返回int
(与Func<string, int>
具有相同的签名):
int Foo(string str)
{
return str.Length + 8941;
}
如果您想使用它来创建一个委托,该委托返回调用字符串Foo
的{{1}}的结果,您可以这样做:
"bar"
请注意,我们创建了一个新的委托,lambda表达式不带任何东西,(在这种情况下)返回调用Func<int> foobar = () => Foo("bar");
的结果。
您可以在代码中应用相同的内容:
Foo("bar")
答案 2 :(得分:0)
它不起作用。你现在不是在调用一个方法......你只是告诉它应该使用哪种方法。
创建事件时,指定包含参数的方法类型。参数在引发事件的地方传递。
以下是有关此主题的教程,可帮助您更好地理解: http://www.csharp-station.com/Tutorials/lesson14.aspx
查看下面的代码也可以帮助您将各个部分组合得更好。
public void SomeMethod()
{
//Assign the delegate
KeyBindings[Keys.Right] += Method1;
}
public PlaceWhereEventGetsRaised()
{
object argument1, argument2;
// set the arguments to something
if (KeyBindings[Keys.Right] != null)
KeyBindings[Keys.Right](argument1, argument2);
}
public void Method1(object argument1, object argument2)
{
// Do stuff
}
如果看起来你无法以你想象的方式完成你想做的事情,那就让我们知道你想要做什么,也许我们可以帮助你找到正确的方法。
答案 3 :(得分:0)
要做这样的事情,你必须创建一个固定内部args的新方法。或者像这样的匿名方法:
event += (s, someEventArgs) => Method1(s, someEventArgs, someOtherArgs)