zoukankan      html  css  js  c++  java
  • C# 关于反射事件

    在frmMain类中的代码

    private void StartRun(string tag, string date, bool tipType)
            {
                var dllPath = string.Format("{0}.{1}", GetType().Namespace, tag);
                var assembly = Assembly.Load(dllPath);
                var classFullPath = string.Format("{0}.{1}.{2}", GetType().Namespace, tag, "RunBTW");
                var type = assembly.GetType(classFullPath);
                object instance = assembly.CreateInstance(classFullPath);
                var eventInfo = type.GetEvent("AppendTips", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);
                var tDelegate = eventInfo.EventHandlerType;

                var miHandler = typeof(frmMain).GetMethod("AppendTips", BindingFlags.Public | BindingFlags.Static);
                var d = Delegate.CreateDelegate(tDelegate, miHandler);
                var miAddHandler = eventInfo.GetAddMethod();
                object[] addHandlerArgs = { d };
                miAddHandler.Invoke(instance, addHandlerArgs);

                var method = type.GetMethod("StartRun");
                method.Invoke(instance, new object[] { date, tipType });
            }

            public static void AppendTips(string tips, Color color, bool tipsType)
            {
                if (frm.richResultAuto.InvokeRequired)
                {
                    AppendTipsDelegate atd = new AppendTipsDelegate(Tips);
                    frm.Invoke(atd, new object[] { tips, color, tipsType });
                }
                else
                {
                    Tips(tips, color, tipsType);
                }
            }

    动态加载dll文件Assembly.Load加载的是相对路径 而Assembly.LoadFile需要一个绝对路径

    frmMain类中的AppendTips方法必须是public static 不然绑定不了。

      var eventInfo = type.GetEvent("AppendTips", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static);中的AppendTips这里是反射了RunBTW类中的AppendTips事件名称。

    public class RunBTW
      {

          public delegate void AppendTipsDelegate(string tips, Color color, bool tipsType);

          public event AppendTipsDelegate AppendTips;

          public void StartRun(string date, bool tipsType)
          {

       }

    }

    RunBTW中的StartRun方法是没有返回值如果有返回值,比如说返回一个int类型

    var cusRerurnValue=  method.Invoke(instance, new object[] { date, tipType });

    这里的cusRerurnValue就是返回值。

    参考自:http://bbs.csdn.net/topics/330067707

    代码改变世界
  • 相关阅读:
    工作两周年—项目研发总结(201105201305)
    Java时间日期格式转换Date转String和String转Date
    Comm100 Email Marketing API学习小结
    outlook错配置账户到exchange后的删除办法
    excel自动调整行高和设置默认行高
    关于通过vmware安装windows8的几个问题及解决无人参与应答文件包含的产品密钥无效
    如何查看各个邮件客户端的邮件标头
    服务网格和Istio初识
    solidity开发2合约结构
    DDraw笔记一个简单的DDraw应用程序
  • 原文地址:https://www.cnblogs.com/oreobyzf/p/6244323.html
Copyright © 2011-2022 走看看