You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 08:13:23