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

如何用CheckAvailability字典更新ActionMenuItemModel的IsAvailable字段

问题描述

我有一个返回Dictionary<IItemWithRules, bool>类型的CheckAvailability方法,代码如下:

public Dictionary<IItemWithRules, bool> CheckAvailability(List<IItemWithRules> tiles)
{
     //...
}

我希望在GetAvailableMenuActions方法中使用该方法,更新集合中ActionMenuItemModel实例的IsAvailable字段,当前该方法代码如下:

public List<ActionMenuItemModel> GetAvailableMenuActions()
{
    var actions = this.actionMenuItemBllFactory.Create()
                      .GetListBy(
                          a => a.Active,
                          z => z.SelectNested(a => a.AvailabilityRules));

     var filteredItems = this.rulesService.FilterItemsWithRules(actions)
                             .OrderBy(a => a.Order)
                            
                             .ToList();


    return this.networkAvailabilityService.CheckAvailability(new List<IItemWithRules>(filteredItems))
                   .Keys.Select(x => new ActionMenuItemModel((ActionMenuItem)x))
                   .ToList();
}

ActionMenuItemModel类定义如下:

public class ActionMenuItemModel
{
    public ActionMenuItemModel()
    {
    }

    public ActionMenuItemModel(ActionMenuItem domainModel)
    {
        this.Id = domainModel.Id;
        this.Label = domainModel.Label;
        this.Href = domainModel.Href;
        this.Target = domainModel.Target;
        this.Icon = domainModel.Icon?.Content;
    }

    public Guid Id { get; init; }

    public string Label { get; init; }

    public string Href { get; init; }

    public string Target { get; init; }

    public string Icon { get; init; }

    public bool IsAvailable { get; init; }
}

当前返回逻辑仅转换字典的Key生成模型,我需要用CheckAvailability返回的字典值,为模型的IsAvailable字段赋值,请问该如何修改代码实现此需求?

解决方案

由于IsAvailable是init修饰的属性,只能在对象初始化阶段赋值,无法在创建实例后修改,因此需要基于字典的键值对来完成模型的初始化,以下两种方式均可实现需求:

方式一:使用对象初始化器直接赋值

修改GetAvailableMenuActions的返回逻辑,先获取完整的可用性字典,再遍历键值对为模型的IsAvailable赋值:

public List<ActionMenuItemModel> GetAvailableMenuActions()
{
    var actions = this.actionMenuItemBllFactory.Create()
                      .GetListBy(
                          a => a.Active,
                          z => z.SelectNested(a => a.AvailabilityRules));

    var filteredItems = this.rulesService.FilterItemsWithRules(actions)
                             .OrderBy(a => a.Order)
                             .ToList();

    // 先获取完整的可用性检查结果字典
    var availabilityDict = this.networkAvailabilityService.CheckAvailability(new List<IItemWithRules>(filteredItems));

    // 遍历键值对,初始化模型时赋值IsAvailable
    return availabilityDict.Select(kv => new ActionMenuItemModel((ActionMenuItem)kv.Key)
    {
        IsAvailable = kv.Value
    }).ToList();
}

方式二:新增构造函数重载(推荐)

先给ActionMenuItemModel增加一个接收领域模型和可用性状态的构造函数,让赋值逻辑更封装:

public class ActionMenuItemModel
{
    public ActionMenuItemModel()
    {
    }

    public ActionMenuItemModel(ActionMenuItem domainModel)
    {
        this.Id = domainModel.Id;
        this.Label = domainModel.Label;
        this.Href = domainModel.Href;
        this.Target = domainModel.Target;
        this.Icon = domainModel.Icon?.Content;
    }

    // 新增构造函数,复用原有构造逻辑并传入可用性状态
    public ActionMenuItemModel(ActionMenuItem domainModel, bool isAvailable) : this(domainModel)
    {
        this.IsAvailable = isAvailable;
    }

    public Guid Id { get; init; }

    public string Label { get; init; }

    public string Href { get; init; }

    public string Target { get; init; }

    public string Icon { get; init; }

    public bool IsAvailable { get; init; }
}

再修改GetAvailableMenuActions的返回逻辑:

public List<ActionMenuItemModel> GetAvailableMenuActions()
{
    var actions = this.actionMenuItemBllFactory.Create()
                      .GetListBy(
                          a => a.Active,
                          z => z.SelectNested(a => a.AvailabilityRules));

    var filteredItems = this.rulesService.FilterItemsWithRules(actions)
                             .OrderBy(a => a.Order)
                             .ToList();

    var availabilityDict = this.networkAvailabilityService.CheckAvailability(new List<IItemWithRules>(filteredItems));

    // 调用新增的构造函数直接传入可用性状态
    return availabilityDict.Select(kv => new ActionMenuItemModel((ActionMenuItem)kv.Key, kv.Value)).ToList();
}

内容的提问来源于stack exchange,提问作者Eugene Sukh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:05:17