C#.NET中已知对象名称属性时如何访问其关联费率属性
根据选中区县名称获取对应费率的实现方法
你不需要硬编码switch分支,也不用纠结SelectList多值绑定的异常问题,只要能拿到用户选中的CountyName值,就可以直接从预定义的静态Counties列表中匹配到完整的County对象,读取对应的CountyRate属性。
实现步骤
- 首先引入LINQ命名空间,用于列表查询:
using System.Linq;
- 封装匹配方法,加入空值校验从根源避免null异常:
/// <summary> /// 根据区县名称获取对应配置费率 /// </summary> /// <param name="selectedCountyName">下拉框选中的区县名称</param> /// <returns>匹配到的区县费率</returns> /// <exception cref="ArgumentException">入参为空时抛出</exception> /// <exception cref="KeyNotFoundException">未找到匹配区县时抛出</exception> public decimal GetMatchedCountyRate(string selectedCountyName) { // 入参空校验,避免null传入后续逻辑 if (string.IsNullOrWhiteSpace(selectedCountyName)) { throw new ArgumentException("选中的区县名称不能为空"); } // 从静态区县列表中匹配名称一致的对象,忽略大小写、前后空格避免匹配失败 County targetCounty = CountyList.Counties .FirstOrDefault(c => c.CountyName.Trim().Equals(selectedCountyName.Trim(), StringComparison.OrdinalIgnoreCase)); if (targetCounty == null) { throw new KeyNotFoundException($"系统中未配置名称为「{selectedCountyName}」的区县费率"); } return targetCounty.CountyRate; }
业务逻辑中的使用方式
在你的计算逻辑中直接调用方法即可,同时满足名称判断和费率计算两个需求:
// 这一步是你已有的逻辑:从下拉列表获取用户选中的区县名称 string userSelectedCountyName = GetDropdownSelectedValue(); // 获取对应费率 decimal currentCountyRate = GetMatchedCountyRate(userSelectedCountyName); // 分支判断直接用拿到的名称变量 if (userSelectedCountyName == "Cool County on the Shore") { // 自定义分支逻辑 decimal taxResult = taxBase * currentCountyRate; // 后续计算逻辑 }
之前方案出现null异常的常见原因
- SelectList多值绑定场景下的null问题,通常是下拉框配置时
DataValueField、DataTextField绑定错位,或者表单提交的参数名和后端接收字段名不匹配,导致后端实际接收到的选中值本身为null,并非多值绑定方案本身存在缺陷 - switch分支运行时抛出null异常,是因为传入switch判断的名称变量没有提前做非空校验,变量为null时直接进入分支判断就会触发空引用异常
提示:后续新增区县配置时,只需要往静态
CountyList.Counties列表中添加新的County实例即可,不需要修改匹配逻辑,维护成本远低于硬编码switch分支。
内容的提问来源于stack exchange,提问作者Elissa121
相关产品推荐
相关产品推荐

