.NET WinForm编程Q&A系列(2)——反射机制
.NET WinForm编程Q&A系列(二)——反射机制

背景
如何更好的认识反射机制,并如何更好的应用反射机制?
概念
1、反射就是动态发现类型信息的能力。
它帮助程序设计人员在程序运行时利用一些信息去动态地使用类型,这些信息在设计时是未知的,这种能力类型于后期绑定。反射还支持的更高级的行为,能在运行时动态创建新类型,并且对这些新类型的操作进行调用。
2、可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现 有对象中获取类型。
3、应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。
需求
1、以某个实例为原型,重新生成一个新的实例,并对某些值做调整
2、获取制定类的属性、方法,并调用其方法
实例
1、定义User类,属性大致包括:UserID、UserName、Age、Address、Remark等
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace WinFormQandA { public class User { public string UserID { get; set; } public string UserName { get; set; } public int Age { get; set; } public string Address { get; set; } public string Remark { get; set; } /// <summary> /// 用于测试方法调用 /// </summary> /// <param name="p1"></param> /// <param name="p2"></param> /// <returns></returns> public int Add(int p1, int p2) { return p1 + p2; } } }2、制定相关处理函数:
/// <summary> /// 获取属性 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { this.richTextBox1.Text = ""; Assembly assembly = Assembly.Load("WinFormQandA"); Type type = assembly.GetType("WinFormQandA.User"); PropertyInfo[] pro = type.GetProperties(); foreach (PropertyInfo p in pro) { this.richTextBox1.Text += p.Name; this.richTextBox1.Text += "\n"; } } /// <summary> /// 获取方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, EventArgs e) { this.richTextBox1.Text = ""; Assembly assembly = Assembly.Load("WinFormQandA"); Type type = assembly.GetType("WinFormQandA.User"); MethodInfo[] met = type.GetMethods(); foreach (MethodInfo m in met) { this.richTextBox1.Text += m.Name; this.richTextBox1.Text += "\n"; } } /// <summary> /// 调用方法 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button3_Click(object sender, EventArgs e) { Assembly assembly = Assembly.Load("WinFormQandA"); Type type = assembly.GetType("WinFormQandA.User"); MethodInfo met = type.GetMethod("Add"); object obj = Activator.CreateInstance(type, null); Object[] num = { 10, 23 }; this.richTextBox1.Text = met.Invoke(obj, num).ToString(); }3、实现效果