zoukankan      html  css  js  c++  java
  • 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;
                }
    ...
  • 相关阅读:
    SAP MM 有了采购订单历史的PO行项目里的采购附加费不允许再改了?
    风之语.人在职场也需要'备胎'
    两万字,任正非采访全记录
    SAP 如何得到交货单上的序列号清单?
    【2019年版】如何向SAP公司提交Message?
    工作上996,生活上669,并不是什么难事儿!
    风之语.甲骨文裁员之我见
    天河2号-保持使用yhrun/srun时连接不中断 (screen 命令教程 )
    PXE 和 计算机网络启动
    Gmail 设置,时区
  • 原文地址:https://www.cnblogs.com/howtrace/p/11064893.html
Copyright © 2011-2022 走看看