在项目开发中,我们有时候难免会用到第三方公司的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; }
}
}
}