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

Getter回退功能异常:获取ListTitle未触发Title getter的问题咨询

问题分析与解决

代码示例

public class WebPageClass
{
    public virtual string Name { get; set; }

    public virtual string Title
    {
        get
        {
            var title = this.GetPropertyValue(page => page.Title);
            return string.IsNullOrWhiteSpace(title) ? Name : title;
        }
        set
        {
            this.SetPropertyValue(page => page.Title, value);
        }
    }

    public virtual string ListTitle
    {
        get
        {
            var listTitle = this.GetPropertyValue(page => page.ListTitle);
            return string.IsNullOrWhiteSpace(listTitle) ? Title : listTitle;
        }
        set
        {
            this.SetPropertyValue(page => page.ListTitle, value);
        }
    }
}

问题原因

这不是C#的预期行为,问题出在你使用的GetPropertyValue这类框架方法(常见于Umbraco等CMS的属性系统)的动态代理机制上:

  • 框架会为虚拟属性生成代理类,当你访问Title时,框架可能绕过你编写的getter逻辑,直接从底层数据存储(如数据库、缓存)读取原始值。
  • 当ListTitle和底层存储的Title值均为null时,框架直接返回null,不会执行你写的Title getter里回退到Name的逻辑。

解决方案

方案一:抽离回退逻辑为独立方法

把属性的回退逻辑封装成私有方法,回退时直接调用方法而非属性,确保执行完整的自定义逻辑:

public class WebPageClass
{
    public virtual string Name { get; set; }

    private string ResolveTitle()
    {
        var title = this.GetPropertyValue(page => page.Title);
        return string.IsNullOrWhiteSpace(title) ? Name : title;
    }

    public virtual string Title
    {
        get => ResolveTitle();
        set => this.SetPropertyValue(page => page.Title, value);
    }

    public virtual string ListTitle
    {
        get
        {
            var listTitle = this.GetPropertyValue(page => page.ListTitle);
            return string.IsNullOrWhiteSpace(listTitle) ? ResolveTitle() : listTitle;
        }
        set => this.SetPropertyValue(page => page.ListTitle, value);
    }
}

方案二:强制调用基类getter(视框架支持情况)

如果框架允许,可通过base.Title强制调用你编写的基类getter逻辑,但这种方式依赖框架的代理实现,可靠性不如方案一:

public virtual string ListTitle
{
    get
    {
        var listTitle = this.GetPropertyValue(page => page.ListTitle);
        return string.IsNullOrWhiteSpace(listTitle) ? base.Title : listTitle;
    }
    set => this.SetPropertyValue(page => page.ListTitle, value);
}

内容的提问来源于stack exchange,提问作者Jon Anders

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:30:19