Blazor中如何用非Lambda方式实现返回计算值的属性
解决方案
1. 定义正确的属性类型
在你的Claim类中,将DetermineClaimsIconState定义为**Func<IconNames>**类型,才能接收你需要的无参委托:
public class Claim { // 你的其他业务属性 public Func<IconNames> DetermineClaimsIconState { get; set; } = () => IconNames.Default; // 设置默认值避免空引用异常 }
2. 后台赋值逻辑
确保ClaimSelectedStateIcon方法返回IconNames类型,参数为Claim实例,再按你的需求赋值:
// 状态判断方法示例 private IconNames ClaimSelectedStateIcon(Claim targetClaim) { // 根据子对象选中状态返回对应图标 if (targetClaim.IsAllChildrenSelected) return IconNames.CheckAll; else if (targetClaim.IsPartialChildrenSelected) return IconNames.CheckPartial; else if (targetClaim.IsNoChildrenSelected) return IconNames.Uncheck; else return IconNames.Default; } // 给新创建的Claim实例赋值 var newClaim = new Claim(); newClaim.DetermineClaimsIconState = () => ClaimSelectedStateIcon(newClaim);
3. Razor页面的正确使用
分两种场景处理:
场景A:可修改Icon组件
如果Icon是自定义组件,直接修改其Name参数类型为Func<IconNames>,在组件内部执行委托获取实际图标值:
<!-- Icon.razor --> <svg height="@Height" width="@Width"> @RenderIcon(Name()) </svg> @code { [Parameter] public Func<IconNames>? Name { get; set; } [Parameter] public int Height { get; set; } = 16; [Parameter] public int Width { get; set; } = 16; private void RenderIcon(IconNames iconName) { // 图标渲染逻辑 } }
此时Razor页面可直接按你要求的写法使用:
<Icon Name="@row.DetermineClaimsIconState" height="15" />
场景B:无法修改Icon组件
如果Icon组件的Name参数仅接受IconNames类型,你需要在Razor里调用委托获取返回值(这不是Lambda,只是执行委托,符合你“不能用Lambda”的要求):
<Icon Name="@row.DetermineClaimsIconState()" height="15" />
4. 避免闭包陷阱
如果在循环中批量创建Claim实例,必须用临时变量捕获当前循环的Claim对象,防止闭包导致所有委托引用最后一个实例:
foreach (var rawData in RawClaimsData) { var currentClaim = new Claim { Id = rawData.Id, DisplayName = rawData.DisplayName // 初始化其他属性 }; // 用临时变量currentClaim捕获,而非直接使用循环变量rawData currentClaim.DetermineClaimsIconState = () => ClaimSelectedStateIcon(currentClaim); ClaimsCollection.Add(currentClaim); }
内容的提问来源于stack exchange,提问作者Grandizer
相关产品推荐
相关产品推荐

