在这里进行了广泛的搜索后,我仍然需要专家的建议:
要求
要求非常标准:将 int 常量映射到资源文件中的字符串,以便本地化工作正常,我们可以轻松地为当前用户语言的下拉列表创建值对列表,以及对 int 值进行反向查找。 Const 整数在不同的类中被定义为静态的。
所以,这是它目前的实现方式,有些东西告诉我它可以做得更好,值得批评:
字典类:
public class TLiteralDic : Dictionary<int, string>
{
//Lookup method
public string getLiteral(int key)
{
if (ContainsKey(key)) {
return this[key];
}
return string.Empty;
}
}
在靠近 UI 层的某个地方,填充下拉控件的扩展方法定义如下:
public static void fill(this TLiteralDic dic, DropDownList ddlst)
{
ddlst.Items.Clear();
foreach (KeyValuePair<int, string> v in dic) {
ddlst.Items.Add(new ListItem(v.Value, v.Key.ToString()));
}
}
添加对(static const int 到资源文件中的字符串):
public static class TLiterals
{
private static TLiteralDic _fileStatus;
public static TLiteralDic FileStatus
{
get
{
if (_fileStatus == null) {
_fileStatus = new TLiteralDic() {
{TFiles.Status.Cancelled, Lists.FileStatus_Cancelled},
{TFiles.Status.Closed, Lists.FileStatus_Closed},
{TFiles.Status.OnHold, Lists.FileStatus_OnHold},
{TFiles.Status.Open, Lists.FileStatus_Open},
{TFiles.Status.Pending, Lists.FileStatus_Pending},
{TFiles.Status.Portal, Lists.FileStatus_Portal}
};
}
return _fileStatus;
}
}
//... hundred of lists like that, short and long (up to 15 entries)
}
在代码中使用
查找:
textStatus.Text = TLiterals.FileStatus.getLiteral(row.FileStatus);
列表填充:
TLiterals.FileStatus.fill(ddlstFileStatus);
注意事项
这个想法是只在一个地方定义映射,并能够从中创建一个列表或通过 int 值进行查找。理想情况下具有良好的性能、最小的内存占用和编码麻烦。
已经考虑过以下备选方案:
- 使用 switch(过去用于查找 - 大量冗余代码)
- 使用反射
- 关闭
- JSON、XML
- 在 VS2010 中使用 T4 类生成
到目前为止,还没有找到简单或明显更好的解决方案。
当前实现中的问题
- 围绕实际对列表的大量重复代码,理想情况下必须全部隐藏并重用
- 需要定义静态私有(private)属性;这个想法是仅在第一次检索列表时才对列表使用“惰性”初始化。
- 在第一次使用后将文字保存在内存中对于这种简单的操作来说可能代价太高
当前实现的优势
- 列表在一个地方定义(与使用相同值对在 2 个不同地方切换查找和手动列表填充相比)
- 重复使用代码进行查找和列表填充。
- 易于维护和编译时间检查。
关于更好的“美丽代码”的任何想法? :)
理想情况下,我希望在定义列表时看到类似这样的内容,但它不应该在真正需要/使用之前进行初始化:
public static TLiteralDic FileStatus = new TLiteralDic () {
{TFiles.Status.Cancelled, Lists.FileStatus_Cancelled},
{TFiles.Status.Closed, Lists.FileStatus_Closed},
{TFiles.Status.OnHold, Lists.FileStatus_OnHold},
{TFiles.Status.Open, Lists.FileStatus_Open},
{TFiles.Status.Pending, Lists.FileStatus_Pending},
{TFiles.Status.Portal, Lists.FileStatus_Portal}
}
最佳答案
it should not initialize until really needed/used:
您可以使用延迟实例化来执行此操作:
Lazy<Dictionary<string, string>> resources = new Lazy<Dictionary<string, string>>(() => new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase));
对字典进行排序也可以帮助您加快搜索速度,例如使用 BinarySearch。
关于c# - 将常量映射到列表填充和查找的资源字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12624959/