C# 如何在子类中读取父类及子类自身所有public/protected变量名
实现方案
你之前只拿到父类字段的核心原因是反射时没有获取当前实例的运行时实际类型,同时BindingFlags参数配置错误,没有覆盖继承链上子类的实例字段。
完整实现代码
using System; using System.Reflection; abstract class Parent { public string var1 = "something"; public virtual void GetAllVar() { // 获取当前实例的运行时实际类型(如果创建的是Child实例,这里拿到的就是Child类型) Type instanceType = this.GetType(); // 获取所有实例级别的公开/非公开字段,覆盖整个继承链 FieldInfo[] allFields = instanceType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy); foreach(var field in allFields) { // 筛选public和protected类型的字段,过滤私有字段和编译器生成的特殊字段 if((field.IsPublic || field.IsFamily) && !field.IsSpecialName) { Console.Write(field.Name + " - "); } } } } class Child : Parent { public string var2 = "somethingAgain"; } // 调用代码 Child c = new Child(); c.GetAllVar();
输出结果
var1 - var2 -
如果不需要统计protected类型的字段,删除筛选条件里的|| field.IsFamily即可。
内容的提问来源于stack exchange,提问作者Virbyker
相关产品推荐
相关产品推荐

