1、反射
//Type:1、创建对象 2、typeof(数据类型)
//1、获取程序集
Assembly ass = Assembly.LoadFile();
//2、通过程序集对象,获取数据类型成员
//2.1GetTypes()不区分是否包含public,它会获取程序集中所有定义的数据类型
Type[] types = ass.GetType();
foreach (var item in types)
{
Console.WriteLine(item.Name);
}
//2.2GetExportedTypes获取所有被public修饰的成员
Type[] types = ass.GetExportedTypes();
foreach (var item in types)
{
Console.WriteLine(item.Name);
}
//2.3操作指定的数据类型
//命名空间与类的关系:解决了重名问题;文件夹与文件的关系
Type type = ass.GetType("命名空间.Person");
//反射并调用Person中的各个成员
//3.1获取类型中的所有成员
MemberInfo[] mems = type.GetMembers();
foreach (var item in mems)
{
Console.WriteLine(item.Name);
}
//3.2获取类型中所有的方法
MethodInfo[] mths = type.GetMethods();
foreach (var item in mths)
{
Console.WriteLine(item.Name);
}
//3.3获取构造函数
ConstructorInfo[] cons = type.GetConstructors();
foreach (var item in cons)
{
Console.WriteLine(item.Name);
}
//3.4获取类型中所有的属性
PropertyInfo[] pros = type.GetProperties();
foreach (var item in pros)
{
Console.WriteLine(item.Name);
}
//3.6执行类型中的静态方法(无参数)
//3.6.1获取要执行的静态方法
MethodInfo mi = type.GetMethod("StaticSayHi");
mi.Invoke(null, null);
//3.7执行类型中的静态方法(带参数)
MethodInfo mi = type.GetMethod("StaticSayHi2");
mi.Invoke(null, new object[] { "world" });
//3.8执行类型中的实例方法
MethodInfo mi = type.GetMethod("SayHi");
//3.8.1动态的间接的创建对象
Object o = Activator.CreateInstance(type);
mi.Invoke(o, null);
//3.9执行类型中的实例方法(带参数)
MethodInfo mi = type.GetMethod("SayHi2");
Object o = Activator.CreateInstance(type);
mi.Invoke(o, new object[] { "world" });
//4.0执行重载
MethodInfo mi = type.GetMethod("Add",new Type[] { typeof(int),typeof(int)});
Object o = Activator.CreateInstance(type);
object res = mi.Invoke(o, new object[] { "hello", "world" });
//4.1构造函数重载
ConstructorInfo ci = type.GetConstructor(new Type[] { }); //调用无参数的构造函数,type数组不能省略
ConstructorInfo ci = type.GetConstructor(new Type[] { typeof(int), typeof(int), typeof(int) });
object o = ci.Invoke(new object[] { 1, 2, 3 });
MethodInfo mi = type.GetMethod("Add", new Type[] { typeof(int), typeof(int) });
object res = mi.Invoke(o, new object[] { 1, 2 });
Console.WriteLine(res);
2、插件
1.程序加载的时候,读取插件文件夹下所有的插件 DLL文件
2.通过反射,获取插件的名称和功能
3.把插件的名称,绑定到菜单栏中,并且给菜单栏添加一个单击事件
4.单击菜单栏的时候,执行插件的功能
private void Form1_Load(object sender, EventArgs e)
{
//1、程序加载的时候,读取插件文件夹下所有的插件 DLL文件
//2、通过反射,获取插件的名称和功能
//3、把插件的名称,绑定到菜单栏中,并且给菜单栏添加一个单击事件
//4、单击菜单栏的时候,执行插件的功能
//获取程序集
string path = Assembly.GetExecutingAssembly().Location;
path = Path.GetDirectoryName(path);
path = Path.Combine(path, "Plug-in-Components");
//读取所有插件全路径
string[] files = Directory.GetFiles(path);
foreach (var file in files)
{
//加载指定路径的程序集内容
Assembly ass = Assembly.LoadFile(file);
//获得程序集的数据类型
Type[] types = ass.GetExportedTypes();
foreach (var item in types)
{
//2、通过反射,获取插件名称和功能
//item不能是接口也不能是抽象类
if (typeof(IProcessStr_Rule).IsAssignableFrom(item) && !item.IsAbstract)
{
object o = Activator.CreateInstance(item);
IProcessStr_Rule processStr_Rule = (IProcessStr_Rule)o;
//menuStrip1:菜单对象 toolStripItem:添加的新菜单选项对象
ToolStripItem toolStripItem = menuStrip1.Items.Add(processStr_Rule.Name);
//动态注册对象
toolStripItem.Click += ToolStripItem_Click;
//4、单击菜单栏的时候,执行插件的功能
//processStr_Rule.ProcessTextStr()
//把插件对象,存储到新创建的菜单选项的对象中
toolStripItem.Tag = processStr_Rule;
}
}
}
}
private void ToolStripItem_Click(object sender, EventArgs e)
{
//sender:触发事件的对象
ToolStripItem toolStripItem = (ToolStripItem)sender;
IProcessStr_Rule rule = (IProcessStr_Rule)toolStripItem.Tag;
rule.ProcessTextStr(textBox1);
}