将常量映射到列表填充和查找的资源字符串

时间:2012-09-27 15:31:44

标签: c# asp.net visual-studio-2010 localization resource-files

经过广泛搜索后,我仍需要专家建议:

要求

需求非常标准:map int从资源文件的字符串开始,因此本地化工作正常,我们可以轻松地为当前用户语言的下拉列表创建值对列表,并对int值进行反向查找。 const整数在不同的类中定义为static。

所以,这是目前的实施方式,有些东西告诉我它可以更好,值得批评:

字典类:

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

添加对(静态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类生成

目前尚未找到简单或明显更好的解决方案。

当前实施中的问题

  • 实际的对列表周围有很多重复的代码,理想情况下必须全部隐藏和重用
  • 需要定义静态私有属性;我们的想法是仅在第一次检索列表时对列表使用“延迟”初始化。
  • 在第一次使用后将文字保留在内存中对于这种简单操作来说价格可能太高

当前实施的优点

  • 在一个地方定义的列表(vs使用相同的值对在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}
}

1 个答案:

答案 0 :(得分:0)

  

在真正需要/使用之前不应该初始化:

您可以使用延迟实例化来执行此操作:

Lazy<Dictionary<string, string>> resources = new Lazy<Dictionary<string, string>>(() => new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase));

对字典进行排序还可以帮助您加快搜索速度,例如使用BinarySearch。