稳健地映射枚举值

时间:2013-05-15 09:55:28

标签: c# asp.net enums

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

首先,我有一个枚举。这将映射到下拉列表 - 表示是文本值,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); }
    }

我调用PartnerEmploymentStatus,然后返回最终输出字符串。

任何想法如何使其更加健壮?

2 个答案:

答案 0 :(得分:3)

然后你需要将它重构为一个翻译区域。可能像访问者模式实现。您的选择是分发代码(正如您现在所做的那样)或访问者来集中代码。您需要建立一定程度的脆弱性,以便在扩展时覆盖测试会显示问题,以便强制您正确维护代码。你处于一个相当普遍的quandry,它实际上是一个代码组织

答案 1 :(得分:1)

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

功能就是这个:

    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;
    }

惯例是,在我的资源文件中,我将拥有与枚举值相同的属性(在您的情况下为NonePartTime等)。这是在帮助函数中执行Join所必需的,您可以根据自己的需要进行调整。

因此,每当我想要枚举值的(本地化)字符串描述时,我只需调用:

var dictionary = EnumUtils.GetEnumNamesFromResources<EmploymentStatusType>(ResourceFile.ResourceManager);
var value = dictionary[EmploymentStatusType.Full];