0

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

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() });

编译器说它不能将参数转换为“对象”。

4

3 回答 3

1

尝试这个

methodInfo.Invoke(null, new object[] { new Action(C.A) });
于 2013-09-29T18:34:23.350 回答
0

First of all your code has a few problems:

1- Method C.A should be declared public in order to be used outside.

2- BindingFlags.NonPublic is preventing to access method 'F' since it is public. Use BindingFlags.Public instead.

Now, you can do as:

methodInfo.Invoke(null, new object[] { new Action(() => { C.A(); }) });
于 2013-09-29T18:32:58.140 回答
0

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

    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++; 

通常,将 label1 替换为 methodInfo。使用功能。使用 Action 你不能传递参数。

于 2016-12-08T12:51:39.543 回答