c#进阶学习day3

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);

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值