如何为使用Lambda表达式定义get的属性设置自动setter
解决Blazor中表达式体属性无法赋值的问题
问题根源
你最初用private bool claimed => !string.IsNullOrEmpty(name);定义的是只读表达式体属性,本质上只有get访问器,没有set,所以执行claimed = false会触发只读错误。
你尝试添加的自动setterset;之所以无效,是因为这个setter没有对应的后台字段,而且你的get访问器是基于name计算的——手动赋值claimed不会改变name的状态,逻辑上不匹配,编译器也无法生成有效的自动实现。
方案1:给claimed添加独立后台字段(支持手动赋值)
如果确实需要手动设置claimed的值,而非完全依赖name的状态,需要给它创建专属的后台字段,同时按需调整逻辑:
@code { private string? name; // 后台字段存储claimed的手动赋值状态 private bool _claimed; private bool claimed { get => _claimed || !string.IsNullOrEmpty(name); // 逻辑示例:手动赋值优先,未赋值时基于name判断 set => _claimed = value; } private void HideClaimedBy() { claimed = false; } }
如果希望手动赋值完全覆盖基于name的计算逻辑,可把get改为get => _claimed;。
方案2:添加额外隐藏标志(保持claimed的计算逻辑)
如果业务逻辑中claimed本就该由name是否为空决定,只是需要临时隐藏显示,建议新增一个独立字段控制可见性:
<input @bind="name" /> <button @onclick="HideClaimedBy">Hide Claimed By</button> @if (claimed && isClaimedVisible) { <p>Claimed by: @name</p> } @code { private string? name; private bool isClaimedVisible = true; private bool claimed => !string.IsNullOrEmpty(name); private void HideClaimedBy() { isClaimedVisible = false; } }
这种方式保持claimed的只读计算属性不变,更贴合业务逻辑的本意。
内容的提问来源于stack exchange,提问作者Oskar
相关产品推荐
相关产品推荐

