urceReader(ListDictionary resourceDictionary)
{
this.m_resourceDictionary = resourceDictionary;
}
public IDictionaryEnumerator GetEnumerator()
{
return this.m_resourceDictionary.GetEnumerator();
}
// 其他方法
}
页面解析器使用读取器的字典枚举器为隐式表达式生成代码。如果未提供读取器或读取器中字典为空,则代码无法生成。隐式表达式不必为每一个属性值均显示值,因为它不是显式的。因此,对于隐式表达式,如果未生成代码来设置值,则默认属性值会随页面一同呈现。
资源回退
资源回退是资源提供程序实现的一个重要部分。资源根据请求线程的当前 UI 区域在运行时被请求。
System.Threading.Thread.Current.CurrentUICulture
如果该区域为一特定区域(如“es-EC”或“es-ES”),则资源提供程序应查看是否存在此特定区域的资源。不过,有可能仅指定了针对中立区域(如“es”)的资源。中立区域为父项。如果未发现任何特定条目,则接下来检查父项。最终应使用应用程序的默认区域,以便能找到值。在此示例中,默认区域为“en”。
资源回退由数据访问组件 StringResourcesDALC 来封装。在使用调用来检索资源时,GetResourceByCultureAndKey() 会被调用。此函数负责打开数据库连接,调用将执行资源回退的递归函数,随后关闭数据库连接。下面显示了 GetResourceByCultureAndKey() 的实现。
public string GetResourceByCultureAndKey(CultureInfo culture, string resourceKey)
{
string resourceValue = string.Empty;
try
{
if (culture == null || culture.Name.Length == 0)
{
culture = new CultureInfo(this.m_defaultResourceCulture);
}
this.m_connection.Open();
resourceValue = this.GetResourceByCultureAndKeyInternal
(culture, resourceKey);
}
finally
{
this.m_connection.Close();
}
return resourceValue;
}
递归函数 GetResourceByCultureAndKeyInternal() 首先尝试查找特定区域的资源。如果没有找到,则搜索父项区域然后重试查询。如果仍未成功,则最后再尝试使用默认区域来查找资源条目。如果使用默认区域仍没有找到资源条目,则可能是示例中发生了严重异常。下面显示了 GetResourceByCultureAndKeyInternal() 的代码清单。
private string GetResourceByCultureAndKeyInternal
(CultureInfo culture, string resourceKey)
{
StringCollection resources = new StringCollection();
string resourceValue = null;
this.m_cmdGetResourceByCultureAndKey.Parameters["cultureCode"].Value
= culture.Name;
this.m_cmdGetResourceByCultureAndKey.Parameters["resourceKey"].Value
= resourceKey;
using (SqlDataReader reader = this.m_cmdGetResourceByCultureAndKey.ExecuteReader())
{
while (reader.Read())
{
resources.Add(reader.GetString(reader.GetOrdinal("resourceValue")));
}
}
if (resources.Count == 0)
{
if (culture.Name == this.m_defaultResourceCulture)
{
throw new InvalidOperationException(String.Format(
Thread.CurrentThread.CurrentUICulture, Properties.Resources.RM_DefaultResourceNotFound, resourceKey));
}
culture = culture.Parent;
if (culture.Name.Length == 0)
{
culture = new CultureInfo(this.m_defaultResourceCulture);
}
resourceValue = this.GetResourceByCultureAndKeyInternal(culture, resourceKey);
}
else if (resources.Count == 1)
{
resourceValue = resources[0];
}
else
{
thro
|