C # - объявить метод в аргументе (делегат) - PullRequest
4 голосов
/ 11 марта 2010

В приведенном ниже коде я передаю метод B как действие, которое будет выполняться над объектами в методе IterateObjects. Я хотел бы спросить, могу ли я явно объявить метод в аргументе вместо передачи его по имени, что-то вроде этого:
a.IterateObjects(delegate void(string s){//method body}) Это не правильно, но я уверен, что видел, как что-то подобное работает. Могли бы вы, пожалуйста, посоветовать? Спасибо

DelTest a = new DelTest(); //class with method IterateObjects
a.IterateObjects(B) //HERE

private void B(string a)
{
    listBox1.Items.Add(a);
}

//another class  ....

public void IterateObjects(Action<string> akce)
{
    foreach(string a in list)
    {
        akce(a);
    }
}

Ответы [ 4 ]

3 голосов
/ 11 марта 2010

Да, вы можете использовать лямбду примерно так:

a.IterateObjects ( x => listBox1.Items.Add(x) );
1 голос
/ 11 марта 2010
    delegate void MyFunctionDelegate(string a);

    public void Main()
    {
        iterateObjects (delegate(string a){/*do something*/});
    }

    public void IterateObjects(MyFunctionDelegate akce)
    {
        foreach(string a in list)
        {
            akce(a);
        }
    }

http://msdn.microsoft.com/en-us/library/900fyy8e%28VS.80%29.aspx

вот и все:)

0 голосов
/ 11 марта 2010

Вы можете использовать лямбда-выражение:

a.IterateObjects((string s) => listBox1.Items.Add(s))
0 голосов
/ 11 марта 2010

Вы можете объявить функцию B как анонимную функцию в точке вызова через лямбда-выражение .

...