如何使用委托作为调用参数?

时间:2013-09-29 18:24:03

标签: c# parameters delegates invoke

如何将动作委托作为参数提供给invoke:

class C {
    static void A {}
    public static void F(Action action) { action(); }
}

现在我可以直接致电F:

F(A);

但是如何通过调用来做同样的事情。以下内容无法编译:

MethodInfo methodInfo = typeof(C).GetMethod("F", BindingFlags.Static |
                                                 BindingFlags.NonPublic);
methodInfo.Invoke(null, new object[]{ A });

我也没有尝试过其他任何事情:

methodInfo.Invoke(null, new object[]{ C.A });
methodInfo.Invoke(null, new object[]{ () => C.A() });

编译器说它无法将参数转换为“object”。

3 个答案:

答案 0 :(得分:1)

试试这个

methodInfo.Invoke(null, new object[] { new Action(C.A) });

答案 1 :(得分:0)

首先,您的代码存在一些问题:

1-方法C.A应声明为public,以便在外面使用。

2- BindingFlags.NonPublic阻止访问方法'F',因为它是public。请改用BindingFlags.Public

现在,你可以这样做:

methodInfo.Invoke(null, new object[] { new Action(() => { C.A(); }) });

答案 2 :(得分:0)

具体来说,要更新另一个线程中的label1,请使用带有Lambda语句的参数的Invoke和Func所需的参数。

    Int32 c = 0;
    Int32 d = 0;
    Func<Int32, Int32,Int32> y;


    c = (Int32)(label1.Invoke(y = (x1, x2) => { label1.Text = (x1 +   
    x2).ToString();  return x1++; }, c,d));
    d++; 

通常,用methodInfo替换label1。使用Func。使用Action,您无法传递参数。