如何将动作委托作为参数提供给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”。
答案 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,您无法传递参数。