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
相关产品推荐
相关产品推荐

