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

替代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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:33:12