)
一、整体功能说明本次代码实现WinForm DLL反射全套进阶操作动态加载外部 DLL 程序集反射读取公共属性 / 反射修改公共属性反射读取公共、私有字段反射调用带参数方法反射获取嵌套类、实例化嵌套类、读取嵌套类属性配合 AppSettings 配置读取类全名实现完全解耦二、被反射的 DLL 实体类完整代码ClassLibrary1编译生成 ClassLibrary1.dll 放到项目 libs 目录using System; namespace ClassLibrary1 { public class Class1 { // 嵌套类 public class SmallClass { public int X { get; set; } 10; } // 公共自动属性 public string Name { get; set; } 张三; public string Id { get; set; } 10086; // 公共字段 public int _age 10; public string _sex 男; // 私有字段反射可读取 private int _idCard 10; // 无参方法 public void F1() { Console.WriteLine(F1); } // 带参方法标记过时 [Obsolete(废弃的原因, false)] public void F2(string a, string b) { Console.WriteLine(F2 a : b); } } }三、WinForm 主界面反射完整代码所需引用命名空间using System; using System.Configuration; using System.IO; using System.Reflection; using System.Windows.Forms;namespace _9反射进阶 { public partial class Form1 : Form { // 全局缓存程序集、目标类型、实例对象 Type type; object o1; Assembly asb; public Form1() { InitializeComponent(); } // 窗体加载加载DLL、创建实例、获取Type private void Form1_Load(object sender, EventArgs e) { // 读取配置文件中保存的 命名空间.类名 string assembleName ConfigurationManager.AppSettings[DAL]; // 拼接DLL路径 string path Path.Combine(Environment.CurrentDirectory, ../../libs/ClassLibrary1.dll); // 加载外部DLL文件 asb Assembly.LoadFile(path); // 动态创建 DLL 中指定类的实例 o1 asb.CreateInstance(assembleName); // 获取目标类的元数据类型 type o1.GetType(); } // 【按钮1】反射修改属性值 private void button1_Click(object sender, EventArgs e) { // 获取所有公共属性 PropertyInfo[] infos type.GetProperties(); foreach (var item in infos) { // 给 Id 属性赋值 if (item.Name Id) { item.SetValue(o1, textBox1.Text); } // 给 Name 属性赋值 else if (item.Name Name) { item.SetValue(o1, textBox2.Text); } } } // 【按钮2】反射读取属性值 private void button2_Click(object sender, EventArgs e) { PropertyInfo[] infos type.GetProperties(); foreach (var item in infos) { if (item.Name Id) { textBox1.Text item.GetValue(o1).ToString(); } else if (item.Name Name) { textBox2.Text item.GetValue(o1).ToString(); } } } // 【按钮3】反射读取字段 调用带参方法 读取嵌套类 private void button3_Click(object sender, EventArgs e) { // 1. 获取【所有公共字段】 FieldInfo[] infos type.GetFields(); foreach (var item in infos) { Console.WriteLine(item.Name ----); if (item.Name _age) { textBox1.Text item.GetValue(o1).ToString(); } else if (item.Name _sex) { textBox2.Text item.GetValue(o1).ToString(); } } // 2. 反射读取【私有字段】_idCard // GetFields 默认只能拿公共字段私有需要特殊绑定拓展 FieldInfo idCardField type.GetField(_idCard, BindingFlags.NonPublic | BindingFlags.Instance); if (idCardField ! null) { MessageBox.Show(idCardField.GetValue(o1).ToString()); } // 3. 反射调用【带参数方法 F2】 MethodInfo inf type.GetMethod(F2); // 参数二参数数组按顺序传参 inf.Invoke(o1, new string[] { 1, 2 }); // 4. 反射获取【嵌套类 SmallClass】 Type t1 type.GetNestedType(SmallClass); // 创建嵌套类实例 object o2 asb.CreateInstance(t1.FullName); // 读取嵌套类的属性 X MessageBox.Show(t1.GetProperty(X).GetValue(o2).ToString()); } } }四、App.config 配置文件必须配置用于动态配置要反射的类全名不用改代码configuration appSettings add keyDAL valueClassLibrary1.Class1 / /appSettings /configuration五、核心知识点逐点解析1. 反射属性读写type.GetProperties()获取所有公共属性item.GetValue(obj)读取属性值item.SetValue(obj,value)修改属性值2. 反射字段读取type.GetFields()默认只获取public 公共字段私有字段必须加绑定标识BindingFlags.NonPublic | BindingFlags.Instance3. 反射调用带参方法GetMethod(方法名)获取方法元数据Invoke(实例, 参数数组)传入参数数组完成调用4. 反射嵌套类重点难点type.GetNestedType(内部类名)获取嵌套子类 Typet1.FullName嵌套类全名ClassLibrary1.Class1SmallClass通过程序集 CreateInstance 实例化内部类六、代码执行流程窗体加载读取DLL → 创建Class1实例 → 缓存Type按钮2读取默认属性回填文本框按钮1修改文本框内容写入反射对象属性按钮3读取公共字段、读取私有字段、调用带参方法、读取嵌套类属性七、高频考点总结属性GetProperties 只能获取public自动属性字段GetFields 默认只能获取public字段私有需要 BindingFlags方法调用有参数必须传参数数组无参数传 null嵌套类必须通过GetNestedType获取不能直接 Load配置文件反射实现完全配置化、无硬编码、插件式开发八、终极背诵口诀属性读写GetValueSetValue改内容字段区分公私域私有标识要补齐方法调用Invoke传参数数组顺序依嵌套类型单独取内部实例动态提。