0

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

首先,我有一个枚举。这被映射到下拉列表 - 描述是文本值,而 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,然后返回最终的输出字符串。

有什么想法可以使它变得更健壮吗?

4

2 回答 2

3

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

于 2013-05-23T12:56:46.493 回答
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];
于 2013-05-23T13:24:57.653 回答