1.项目中有个需求,需要在异步线程中对控件线程UI操作 ,需通过 Control.Invoke 实现 ,因为 Invoke 委托方法 需要传入 out 参数 ,网上找到相关方案如下:
public static bool TryParse( string text, out int number ) { .. } MethodInfo method = GetTryParseMethodInfo(); object[] parameters = new object[]{ "12345", null } object result = method.Invoke( null, parameters ); bool blResult = (bool)result; if ( blResult ) { int parsedNumber = (int)parameters[1]; }
示例方法可以看出,通过反射实现 , parameters 是object [] 对象数组,因为是引用类型,效果等同于 out 。
2. 示例代码应用至项目中如下
调用说明:
a. 通过 typeof(IDCodePrinterReprint).GetMethod("GetPackstatus") 获取调用方法元数据。
b. GetPackstatus 方法需为public 类型,否则 GetMethod("GetPackstatus") 无法返回结果。
c. 注意 , 通过objParms 数组传入参数,最外层 传入对象是 new object [] { objParms } , 这里 invoke 传入 对象数组,实示接收参数拆成单个子参数,
如 invoke( method , object [3] ) 调用委托, method 签名 可以是 method(object obj1 , object obj2 , object obj3 ) ;
d. Invoke 调用非静态方法 ,需传入对象实例,这里对象实例 是 this 对象 ,否则提示: System.Reflection.TargetException:“非静态方法需要一个目标。”
public bool GetPackstatus(string jsonArg, out string Pack1SN, out string Pack2SN) { Pack1SN = Pack2SN = string.Empty; if (InvokeRequired) { object[] objParms = new object[3] { jsonArg, null, null }; object result = Invoke(new Func<object[], object>((obj) => { MethodInfo methodInfo = typeof(IDCodePrinterReprint).GetMethod("GetPackstatus"); return methodInfo.Invoke(this, obj); }), new object[] { objParms }); Pack1SN = objParms[1] as string; Pack2SN = objParms[2] as string; return (bool)result; }
...