.net 反射注册自定义事件

在项目开发中,我们有时候难免会用到第三方公司的dll文件,如果我们直接引用,会提高开发效率,但会增加项目与第三方公司的dll耦合度,不利于后续的项目升级。

这个时候用反射无疑是最好的解决办法,反射调用方法获取属性,这个网上的文章很多,可以自行百度。但是反射注册自定义事件或者调用委托很少,我在网上找到的例子大多是基于EventHandler的事件,所以这里我与大家分享一下

这里自己做了一个小demo

工程部分代码

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string fullPath2 = AppDomain.CurrentDomain.BaseDirectory + "\\ConsoleApplication2.dll";
            System.Reflection.Assembly assembly2 = System.Reflection.Assembly.LoadFile(fullPath2);
            object objInstance = assembly2.CreateInstance("ConsoleApplication2.CustomerClass");
            //获得事件
            EventInfo eInfo = objInstance.GetType().GetEvent("CustomerEvent");
            Type handlerType = eInfo.EventHandlerType;
            //事件触发时的方法
            MethodInfo inf = typeof(Program).GetMethod("cc_CustomerEvent");
            Delegate d0 = Delegate.CreateDelegate(handlerType, inf);
            //注册事件
            eInfo.AddEventHandler(objInstance, d0);
            //调用方法触发事件
            MethodInfo method = objInstance.GetType().GetMethod("WriteStr");
            method.Invoke(objInstance, null);
            Console.ReadKey();
        }

        public static void cc_CustomerEvent(object sender, object attribute)
        {
            //获得事件中提供的对象属性
            PropertyInfo info = attribute.GetType().GetProperty("name");
            if (info.GetValue(attribute,null) != null)
            {
                Console.WriteLine(info.GetValue(attribute, null));
            }
        }
    }
}

第三方dll,自定义委托事件

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }

    public class CustomerClass
    {
        public delegate void CustomerEventHandler(object sender, Student str);
        public event CustomerEventHandler CustomerEvent;

        public CustomerClass(){ }

        public void WriteStr()
        {
            Student stu = new Student();
            stu.name = "张三";
            CustomerEvent(null, stu);
        }
    }

    public class Student
    {
        public Student() { }

        public string _name = string.Empty;
        public string name
        {
            get { return _name; }
            set { _name = value; }
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值