我有一个表格,我从用户那里收集数据。收集这些数据后,我将其传递给各个合作伙伴,但每个合作伙伴对每个数据都有自己的规则,因此必须进行转换。我可以做到这一点,但我担心的是稳健性。这是一些代码:
首先,我有一个枚举。这将映射到下拉列表 - 表示是文本值,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,然后返回最终输出字符串。
任何想法如何使其更加健壮?
答案 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;
}
惯例是,在我的资源文件中,我将拥有与枚举值相同的属性(在您的情况下为None
,PartTime
等)。这是在帮助函数中执行Join
所必需的,您可以根据自己的需要进行调整。
因此,每当我想要枚举值的(本地化)字符串描述时,我只需调用:
var dictionary = EnumUtils.GetEnumNamesFromResources<EmploymentStatusType>(ResourceFile.ResourceManager);
var value = dictionary[EmploymentStatusType.Full];