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

C#如何动态给对象属性赋值,无需多if else分支实现不同actionType属性设值

解决方案

方案1:字典映射委托(推荐)

该方案类型安全、性能优异,没有反射的运行时报错风险,12种actionType只需一次性配置字典即可,后续新增类型也只需要加一行字典配置,不需要修改业务逻辑。
首先在服务类中定义静态字典,全局只初始化一次:

private static readonly Dictionary<string, Action<getMyDatas>> _flagSetterMap = new(StringComparer.OrdinalIgnoreCase)
{
    ["A"] = d => { d.AFlag = true; d.AFlagSpecified = true; },
    ["B"] = d => { d.BFlag = true; d.BFlagSpecified = true; },
    ["C"] = d => { d.cFlag = true; d.cFlagSpecified = true; },
    // 剩余9种actionType直接在这里补充配置即可
};

修改后的业务方法代码:

public async Task<OutPutList[]> GetMyDataAsync(string actionType)
{
    var request = new getMyDataRequest
    {
        getMyDatas = new getMyDatas
        {
            AFlag= false,
            AFlagSpecified = false,
            BFlag=false,
            BFlagSpecified=false,
            cFlag=false,
            cFlagSpecified=false,
            commonproperty= ""
        }
    };

    // 匹配到规则就执行对应赋值
    if (_flagSetterMap.TryGetValue(actionType, out var setter))
    {
        setter(request.getMyDatas);
    }

    return await _myService.method(request);
}

方案2:反射动态赋值

如果你的Flag属性严格遵循{actionType}Flag、{actionType}FlagSpecified的命名规则,可以用反射实现零配置扩展,后续新增actionType不需要修改任何代码:

public async Task<OutPutList[]> GetMyDataAsync(string actionType)
{
    var request = new getMyDataRequest
    {
        getMyDatas = new getMyDatas
        {
            commonproperty= ""
            // 其余Flag属性不需要手动赋值,bool类型默认就是false
        }
    };

    var datasType = typeof(getMyDatas);
    // 忽略大小写适配你代码中小写cFlag的命名
    var flagProp = datasType.GetProperty($"{actionType}Flag", BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
    var specifiedProp = datasType.GetProperty($"{actionType}FlagSpecified", BindingFlags.Public | BindingFlags.Instance | BindingFlags.IgnoreCase);
    
    if (flagProp != null && specifiedProp != null)
    {
        flagProp.SetValue(request.getMyDatas, true);
        specifiedProp.SetValue(request.getMyDatas, true);
    }

    return await _myService.method(request);
}

该方案优缺点:

  • 优点:后续新增actionType只要属性命名符合规则,不需要修改任何代码
  • 缺点:存在运行时报错风险,性能略低于字典方案,命名规则不统一会失效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:27:00