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

问询:当类的匹配ID属性变更时更新Name属性的最佳实践

最佳实践方案

针对多组ID-Name属性的联动更新需求,推荐以下几种解决方案,按优先度排序:

1. 封装通用ID-Name关联类(首推)

把每组ID与Name的联动逻辑封装成独立类,彻底消除重复代码,符合单一职责原则,后续新增属性组只需添加类实例即可。

实现代码

// 封装通用的用户ID-名称关联类
public class UserPair
{
    private int _userId;
    private string _userName;

    public int Id
    {
        get => _userId;
        set
        {
            if (_userId == value) return; // 避免重复触发更新
            _userId = value;
            // 调用Web引用获取对应名称
            _userName = new FillUser(value).FullUserName;
        }
    }

    // Name设为只读,仅通过Id变更自动更新
    public string Name => _userName;
}

// 原Request类改造
public class Request
{
    // 直接声明多组UserPair实例
    public UserPair X { get; set; } = new UserPair();
    public UserPair Y { get; set; } = new UserPair();

    // 如需兼容原有XID/XName属性命名,可添加包装属性
    public int XID
    {
        get => X.Id;
        set => X.Id = value;
    }

    public string XName => X.Name;

    public int YID
    {
        get => Y.Id;
        set => Y.Id = value;
    }

    public string YName => Y.Name;
}

优势

  • 逻辑集中,修改获取名称的逻辑只需改动UserPair类
  • 新增属性组无需重复编写联动代码,仅需添加新的UserPair实例
  • 避免原代码中属性类型不匹配的编译错误(原代码中int类型的ID直接赋值给string类型的Name属性会报错)

2. 反射统一处理(兼容原有属性结构时使用)

如果必须保留原有XID/XName、YID/YName的独立属性结构,可通过反射统一处理联动逻辑,减少重复代码。但反射存在一定性能开销,仅适合属性组数量不多的场景。

实现代码

public class Request
{
    private int _xID;
    public int XID
    {
        get => _xID;
        set
        {
            _xID = value;
            UpdateCorrespondingName(nameof(XID), value);
        }
    }

    private string _xName;
    public string XName
    {
        get => _xName;
        private set => _xName = value;
    }

    private int _yID;
    public int YID
    {
        get => _yID;
        set
        {
            _yID = value;
            UpdateCorrespondingName(nameof(YID), value);
        }
    }

    private string _yName;
    public string YName
    {
        get => _yName;
        private set => _yName = value;
    }

    // 通用更新方法:根据ID属性名匹配对应Name属性
    private void UpdateCorrespondingName(string idPropName, int idValue)
    {
        // 按命名规则转换为Name属性名(如XID → XName)
        string namePropName = idPropName.Replace("ID", "Name");
        var nameProp = GetType().GetProperty(namePropName, 
            System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
        
        if (nameProp != null && nameProp.CanWrite)
        {
            string userName = new FillUser(idValue).FullUserName;
            nameProp.SetValue(this, userName);
        }
    }
}

注意事项

  • 必须严格遵循ID/Name的命名规则,否则无法匹配对应属性
  • 反射会带来一定性能损耗,不适合高频更新的场景

3. 源生成器(大型项目批量生成场景)

如果项目中有大量此类属性组,可使用.NET源生成器自动生成联动代码,既保留原有属性结构,又避免手动编写重复代码。但实现成本较高,适合需要批量处理的大型项目。


内容的提问来源于stack exchange,提问作者M. Almog

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:27:38