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

如何为使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 20:45:38