替代Switch Case:C#实现CSV到Dynamics CRM的状态映射方案
问题描述
我正在使用C#读取从其他系统导出的CSV文件,并在Microsoft Dynamics CRM中创建记录。但两个系统的状态定义不同,需要将CSV中的状态值映射为Dynamics CRM对应的状态值后再用于创建记录。当前我通过Switch Case实现该映射,代码如下,请问有什么更优的实现方式?
public string MapDEStatusToDynamics(string name) //name is from csv file { var primaryStatus=string.Empty; switch (name) { case "Applying for Probate": primaryStatus = "Applying"; break; case "Hold Up (Lending/Securities)": primaryStatus = "Unresolved Lending / Securities"; break; case "Awaiting POD": primaryStatus = "Awaiting proof of death"; break; case "Close Case": primaryStatus = "Closed"; break; } return primaryStatus ; //primary status is text in dynamics }
优化方案
1. 字典映射(最常用的静态映射方案)
字典的键值对结构天生适配这种静态映射场景,代码更简洁,查找效率为O(1),后续新增映射规则只需添加键值对,无需修改分支逻辑。
示例代码:
// 定义为类的静态只读成员,避免每次调用方法重复初始化 private static readonly Dictionary<string, string> _statusMapping = new Dictionary<string, string> { {"Applying for Probate", "Applying"}, {"Hold Up (Lending/Securities)", "Unresolved Lending / Securities"}, {"Awaiting POD", "Awaiting proof of death"}, {"Close Case", "Closed"} }; public string MapDEStatusToDynamics(string name) { // TryGetValue避免键不存在时抛出异常,默认返回string.Empty _statusMapping.TryGetValue(name, out var targetStatus); return targetStatus ?? string.Empty; }
2. 配置文件存储映射(适合需频繁修改规则的场景)
如果后续映射规则需要经常调整,不想改动代码重新编译,可以把映射关系放到配置文件中,修改配置即可更新映射逻辑。
示例配置(appsettings.json):
"StatusMappings": { "Applying for Probate": "Applying", "Hold Up (Lending/Securities)": "Unresolved Lending / Securities", "Awaiting POD": "Awaiting proof of death", "Close Case": "Closed" }
读取配置的C#代码:
private readonly Dictionary<string, string> _statusMapping; // 通过依赖注入获取配置实例 public YourServiceClass(IConfiguration configuration) { _statusMapping = configuration.GetSection("StatusMappings") .Get<Dictionary<string, string>>() ?? new Dictionary<string, string>(); } public string MapDEStatusToDynamics(string name) { _statusMapping.TryGetValue(name, out var targetStatus); return targetStatus ?? string.Empty; }
3. 枚举+特性映射(适合状态值固定、追求类型安全的场景)
如果CSV和Dynamics的状态可以对应枚举类型,用自定义特性标记映射关系,能获得更好的类型安全性。
示例代码:
// 自定义特性,用于标记对应Dynamics的状态文本 public class DynamicsStatusAttribute : Attribute { public string StatusText { get; } public DynamicsStatusAttribute(string statusText) => StatusText = statusText; } // CSV状态枚举,用特性标记映射关系 public enum CsvStatus { [DynamicsStatus("Applying")] ApplyingForProbate, [DynamicsStatus("Unresolved Lending / Securities")] HoldUpLendingSecurities, [DynamicsStatus("Awaiting proof of death")] AwaitingPOD, [DynamicsStatus("Closed")] CloseCase } public string MapDEStatusToDynamics(string name) { // 处理字符串到枚举的转换(需根据实际CSV值调整格式处理逻辑) var enumName = name.Replace(" ", "").Replace("(", "").Replace(")", ""); if (Enum.TryParse<CsvStatus>(enumName, out var csvStatus)) { // 通过反射获取特性中的映射值 var memberInfo = typeof(CsvStatus).GetMember(csvStatus.ToString())[0]; var attribute = memberInfo.GetCustomAttribute<DynamicsStatusAttribute>(); return attribute?.StatusText ?? string.Empty; } return string.Empty; }
内容的提问来源于stack exchange,提问作者MVC_Nhibernate
相关产品推荐
相关产品推荐

