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,不会执行你写的Titlegetter里回退到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
相关产品推荐
相关产品推荐

