为何GetType()返回派生类型但GetType().GetProperties()仅返回基类属性?
问题解决:反射无法获取派生类非公共属性的原因及修复
核心原因
Type.GetProperties()方法默认仅返回当前类型及所有基类的公共(public)成员。你调试时GetType()返回SearchOne是正确的,但如果派生类里的Parameter1/2/3属性未标记为public,反射就无法检索到这些非公共属性,只能拿到基类SearchBase的SearchName属性。
修复方案
把派生类中需要被反射识别的属性标记为public即可,修正后的代码如下:
interface IParameter { string ParameterValue { get; } } class SearchBase { public string SearchName { get; set; } protected List<IParameter> ListOfParameters() { return GetType().GetProperties() .Where(p => typeof(IParameter).IsAssignableFrom(p.PropertyType)) .Select(x => (IParameter)x.GetValue(this)) .ToList(); } } class SearchOne : SearchBase { // 明确标记为public,确保反射能获取到 public IParameter Parameter1 { get; set; } public IParameter Parameter2 { get; set; } public IParameter Parameter3 { get; set; } public void DoSomething() { var properties = ListOfParameters(); // 此时properties会包含Parameter1/2/3三个实例 } }
额外说明
如果确实需要处理非公共属性,可以通过指定BindingFlags参数扩展反射的检索范围:
var properties = GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
但这种场景下,将属性设为public是更符合面向对象设计规范的做法,既能满足反射需求,也能保证类成员的访问权限合理性。
内容的提问来源于stack exchange,提问作者Jase99
相关产品推荐
相关产品推荐

