WinForm Invoke 调用 传入 out 类型参数

 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;
            }
...
原文地址:https://www.cnblogs.com/howtrace/p/11064893.html