C#Action封装带签名的方法void SomeFunc(class arg)

时间:2011-02-01 09:56:14

标签: c# delegates action

它存在类似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 个答案:

答案 0 :(得分:1)

你要做的事情并不是很清楚。您的代码尝试错误地创建委托 - 您传入方法调用的返回值:

new System.Action(RefreshContactsData(freshFriends))

而不是方法本身:

new System.Action(RefreshContactsData)

但是,创建一个委托只是为了立即调用它没有意义 - 你可以直接调用该方法。 OnUIThread做了什么?你想要实现什么目标?

答案 1 :(得分:0)

如果我理解正确,您可以使用generic Action delegate。你可以写:

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

答案 2 :(得分:0)

您可以使用Action<>类型来封装采用参数的方法,或者如果您需要返回值,则使用FuncFunc<>类型。例如:

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

注意如何创建操作,只是引用封装在其中的方法,然后调用它,传递所需的参数。

答案 3 :(得分:0)

您不需要Action,而是Action<>

new System.Action<IEnumerable<KeyValuePair<string, UserInfo>>>(RefreshContactsData).BeginInvoke(freshFriends, null, null);