Как передать аргументы делегатам? - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть следующий псевдокод, который работает:

KeyBindings[Keys.Right] += Method1;
KeyBindings[Keys.Right] += Method2;

Проблема, с которой я сталкиваюсь, заключается в том, что я хотел бы иметь возможность сделать это:

KeyBindings[Keys.Right] += Method1(argument);
KeyBindings[Keys.Right] += Method2(argument1, argument 2);

Isэто возможно?Если да, то как мне переписать мой код для достижения этой цели?


Назначение клавиш определяется как:

Dictionary<Keys, Action> KeyBindings = new Dictionary<Keys, Action>();

Ответы [ 4 ]

3 голосов
/ 23 февраля 2012
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) {
    }
}
3 голосов
/ 23 февраля 2012

Ну, в общем, если вы хотите создать делегат, который будет принимать некоторую существующую функцию и применять предварительно заданный набор аргументов, вам нужно будет обернуть функцию внутри другой.

например.,

Рассмотрим функцию Foo(), которая принимает один аргумент string и возвращает int (которая имеет такую ​​же сигнатуру, что и Func<string, int>):

int Foo(string str)
{
    return str.Length + 8941;
}

Если вы хотите использовать это для создания делегата, который возвращает результат вызова Foo строки "bar", вы можете сделать это:

Func<int> foobar = () => Foo("bar");

Итак, обратите внимание, что мы создали новый делегат, лямбда-выражение, которое ничего не берет и (в этом случае) возвращает результат вызова Foo("bar").


Вы можете применить то же самое в своем коде:

KeyBindings[Keys.Right] += new Action(() => Method1(argument));
KeyBindings[Keys.Right] += new Action(() => Method2(argument1, argument 2));
0 голосов
/ 23 февраля 2012

Чтобы сделать это, вы должны создать новый метод, в котором эти аргументы зафиксированы внутри. Или анонимный метод, подобный этому:

event += (s, someEventArgs) => Method1(s, someEventArgs, someOtherArgs)
0 голосов
/ 23 февраля 2012

Так не работает. В этот момент вы не вызываете метод ... вы просто указываете, какой метод он должен использовать.

Когда вы создаете событие, вы указываете, какой метод он принимает, который включает параметры. Параметры передаются в том месте, где происходит событие.

Вот учебник по этой теме, который поможет вам лучше понять: http://www.csharp -station.com / Учебники / 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
}

Если похоже, что вы не можете выполнить то, что вы хотели сделать, как вы думали, то дайте нам знать, что вы пытаетесь сделать, и, возможно, мы сможем помочь вам найти правильный подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...