如何将参数传递给代理人?

时间:2012-02-23 06:44:28

标签: c# events

我有以下伪代码可用:

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>();

4 个答案:

答案 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)