C# 关于反射事件

Posted oreo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于C# 关于反射事件的主要内容,如果未能解决你的问题,请参考以下文章

关于C#反射Assembly.load() .CreateInstance() 未报错, 返回对象为空

关于利用memcached服务器实施反射DDoS攻击的情况通报

C#反射与特性:反射基础

从 C# 检测关于 powerpoint 形状的事件

C# windows 窗体 - 关于跨线程事件的问题

C#一个关于委托和事件通俗易懂的例子