C# 鲁棒映射枚举值

C# 鲁棒映射枚举值,c#,asp.net,enums,C#,Asp.net,Enums,我有一个从用户那里收集数据的表单。当收集到这些数据时,我会将其传递给各个合作伙伴,但是每个合作伙伴对每一条数据都有自己的规则,因此必须对其进行转换。我可以做到这一点,但我担心的是它的健壮性。下面是一些代码: 首先,我有一个枚举。这映射到下拉列表-描述是文本值,int映射到值 public enum EmploymentStatusType { [Description("INVALID!")] None = 0, [Description("Permanent full-

我有一个从用户那里收集数据的表单。当收集到这些数据时,我会将其传递给各个合作伙伴,但是每个合作伙伴对每一条数据都有自己的规则,因此必须对其进行转换。我可以做到这一点,但我担心的是它的健壮性。下面是一些代码:

首先,我有一个枚举。这映射到下拉列表-描述是文本值,int映射到值

public enum EmploymentStatusType
{
    [Description("INVALID!")]
    None = 0,
    [Description("Permanent full-time")]
    FullTime = 1,
    [Description("Permanent part-time")]
    PartTime = 2,
    [Description("Self employed")]
    SelfEmployed = 3
}
提交表单时,所选值将转换为其正确的类型并存储在另一个类中-该属性如下所示:

    protected virtual EmploymentStatusType EmploymentStatus
    {
        get { return _application.EmploymentStatus; }
    }
对于拼图的最后一位,我将值转换为所需的字符串值:

    Dictionary<EmploymentStatusType, string> _employmentStatusTypes;
    Dictionary<EmploymentStatusType, string> EmploymentStatusTypes
    {
        get
        {
            if (_employmentStatusTypes.IsNull())
            {
                _employmentStatusTypes = new Dictionary<EmploymentStatusType, string>()
                {
                    { EmploymentStatusType.FullTime, "Full Time" },
                    { EmploymentStatusType.PartTime, "Part Time" },
                    { EmploymentStatusType.SelfEmployed, "Self Employed" }
                };
            }

            return _employmentStatusTypes;
        }
    }

    string PartnerEmploymentStatus
    {
        get { return _employmentStatusTypes.GetValue(EmploymentStatus); }
    }
Dictionary\u employmentStatusTypes;
字典EmploymentStatusTypes
{
得到
{
if(_employmentStatusTypes.IsNull())
{
_employmentStatusTypes=新字典()
{
{EmploymentStatusType.FullTime,“FullTime”},
{EmploymentStatusType.PartTime,“PartTime”},
{EmploymentStatusType.Self-Employeed,“Self-Employeed”}
};
}
返回_employmentStatusTypes;
}
}
字符串PartnerEmploymentStatus
{
获取{return _employmentStatusTypes.GetValue(EmploymentStatus);}
}
我调用PartnerEmploymentStatus,然后返回最终的输出字符串


您知道如何使其更健壮吗?

然后您需要将其重构为一个翻译区域。可能类似于访问者模式实现。您的选择是分发代码(正如您现在所做的那样)或将其集中的访问者。您需要构建一定程度的脆弱性,以便在扩展时覆盖测试将显示问题,从而迫使您正确维护代码。您处于一个相当常见的quandry中,这实际上是一个代码组织的quandry,然后您需要将其重构为一个翻译区域。可能类似于访问者模式实现。您的选择是分发代码(正如您现在所做的那样)或将其集中的访问者。您需要构建一定程度的脆弱性,以便在扩展时覆盖测试将显示问题,从而迫使您正确维护代码。您处于一个相当常见的quandry中,这实际上是一个代码组织的quandry

我在我的一个项目中遇到过这样的问题,我通过使用助手函数和资源名称约定解决了这个问题

功能如下:

    public static Dictionary<T, string> GetEnumNamesFromResources<T>(ResourceManager resourceManager, params T[] excludedItems)
    {
        Contract.Requires(resourceManager != null, "resourceManager is null.");

        var dictionary =
            resourceManager.GetResourceSet(culture: CultureInfo.CurrentUICulture, createIfNotExists: true, tryParents: true)
            .Cast<DictionaryEntry>()
            .Join(Enum.GetValues(typeof(T)).Cast<T>().Except(excludedItems),
                de => de.Key.ToString(),
                v => v.ToString(),
                (de, v) => new
                {
                    DictionaryEntry = de,
                    EnumValue = v
                })
            .OrderBy(x => x.EnumValue)
            .ToDictionary(x => x.EnumValue, x => x.DictionaryEntry.Value.ToString());
        return dictionary;
    }

我确实在我的一个项目中遇到过这样的问题,我通过使用一个helper函数和资源名称约定解决了这个问题

功能如下:

    public static Dictionary<T, string> GetEnumNamesFromResources<T>(ResourceManager resourceManager, params T[] excludedItems)
    {
        Contract.Requires(resourceManager != null, "resourceManager is null.");

        var dictionary =
            resourceManager.GetResourceSet(culture: CultureInfo.CurrentUICulture, createIfNotExists: true, tryParents: true)
            .Cast<DictionaryEntry>()
            .Join(Enum.GetValues(typeof(T)).Cast<T>().Except(excludedItems),
                de => de.Key.ToString(),
                v => v.ToString(),
                (de, v) => new
                {
                    DictionaryEntry = de,
                    EnumValue = v
                })
            .OrderBy(x => x.EnumValue)
            .ToDictionary(x => x.EnumValue, x => x.DictionaryEntry.Value.ToString());
        return dictionary;
    }

您认为什么是“非健壮的”?我担心的是,如果/当枚举发生更改/增长时——这是可能的,因为新的合作伙伴可能有不同的规则需要适应,那么所有其他包含映射的类都需要更改和休息。如果我有30个合作伙伴,这可能会成为一项艰巨的任务。然后你需要将其重构为一个翻译区域。可能类似于访问者模式实现。您的选择是分发代码(正如您现在所做的那样)或将其集中的访问者。您需要构建一定程度的脆弱性,以便在扩展时覆盖测试将显示问题,从而迫使您正确维护代码。您现在处于一个相当普通的quandry中,这实际上是一个代码组织的quandry中。@JohnNicholas-感谢访问者模式建议-查找它,这正是我正在做的。有时候,保证是正确的答案。那么,我会给你一个答案;p同意保证,我发现我在这里提出的越来越多的问题只是在测试我自己是否理智嗨,我有一个我认为没有答案的问题,有人能给我一个能帮助我的答案吗?“你认为什么是“不稳健的”?我担心的是,如果/当枚举发生变化/增长-这是可能的,因为新的合作伙伴可能有需要适应的不同规则,然后,所有其他包含映射的类都需要更改和休息。如果我有30个合作伙伴,这可能会成为一项艰巨的任务。然后你需要将其重构为一个翻译区域。可能类似于访问者模式实现。您的选择是分发代码(正如您现在所做的那样)或将其集中的访问者。您需要构建一定程度的脆弱性,以便在扩展时覆盖测试将显示问题,从而迫使您正确维护代码。您现在处于一个相当普通的quandry中,这实际上是一个代码组织的quandry中。@JohnNicholas-感谢访问者模式建议-查找它,这正是我正在做的。有时候,保证是正确的答案。那么,我会给你一个答案;p同意保证,我发现我在这里提出的越来越多的问题只是在测试我自己是否理智嗨,我有一个我认为没有答案的问题,有人能给我一个帮助我的答案吗?”