C # Действие, которое инкапсулирует метод с подписью void SomeFunc (класс arg) - PullRequest
2 голосов
/ 01 февраля 2011

Существует что-то вроде Action, но которое может инкапсулировать метод с подписью:

void SomeFunc (IDictionary), я пытаюсь решить это:

    private void RefreshContactList()
    {
        var freshFriends = Service.GetAllFriends(Account);

        new System.Action(RefreshContactsData(freshFriends)).OnUIThread();
    }

    private void RefreshContactsData(IEnumerable<KeyValuePair<string, UserInfo>> freshFriends)
    {
          //...
    }

Ответы [ 4 ]

1 голос
/ 01 февраля 2011

Не совсем понятно, что вы пытаетесь сделать. Ваш код пытается создать делегата неправильно - вы передаете возвращаемое значение вызова метода:

new System.Action(RefreshContactsData(freshFriends))

вместо самого метода:

new System.Action(RefreshContactsData)

Однако не было бы никакого смысла в создании делегата только для его немедленного вызова - вы также можете легко вызвать метод напрямую. Что делает OnUIThread? Чего ты пытаешься достичь?

0 голосов
/ 01 февраля 2011

Вам не нужно Action, но Action<>:

new System.Action<IEnumerable<KeyValuePair<string, UserInfo>>>(RefreshContactsData).BeginInvoke(freshFriends, null, null);
0 голосов
/ 01 февраля 2011

Вы можете использовать тип Action<>, который инкапсулирует метод, принимающий параметр, или, если вам нужно возвращаемое значение, типы Func и Func<>. Например:

static void PrintHello()
{
  Console.WriteLine("Hello world");
}

static void PrintMessage(string message)
{
  Console.WriteLine("Hello " + message);
}

....
Action hello = new Action(PrintHello);
Action<string> message = new Action<string>(PrintMessage);

hello();
message("my world");

производит:

Hello world
Hello my world

Обратите внимание, как создается действие, просто ссылаясь на метод, который инкапсулирован внутри, а затем вызывается, передавая необходимый параметр.

0 голосов
/ 01 февраля 2011

Если я вас правильно понимаю, вы можете использовать универсальный делегат действий .Вы можете написать тогда:

Action<IDictionary> myAction; //with one parameter
Action<IDictionary, int> myAction2; //with two parameters
...