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;
                }
    ...
  • 相关阅读:
    洛谷 2574 XOR的艺术
    洛谷 1774 最接近神的人
    洛谷 3398 仓鼠找sugar 【模板】判断树上两链有交
    洛谷 2440 木材加工
    洛谷 1824 进击的奶牛
    洛谷 1873 砍树
    洛谷 1577 切绳子
    51nod1485 字母排序
    51nod1055 最长等差数列
    51nod1128 正整数分组V2
  • 原文地址:https://www.cnblogs.com/howtrace/p/11064893.html
Copyright © 2011-2022 走看看