我有这段代码,当我尝试获取不存在的文化时,我会遇到异常。
是否存在类似TryGetCultureInfo
返回bool
值的方法?我不想使用try-catch
声明
CultureInfo culture = CultureInfo.GetCultureInfo(cultureCode);
if (culture == null)
{
culture = CultureInfo.GetCultureInfo(DefaultCultureCode);
}
我有这段代码,当我尝试获取不存在的文化时,我会遇到异常。
是否存在类似TryGetCultureInfo
返回bool
值的方法?我不想使用try-catch
声明
CultureInfo culture = CultureInfo.GetCultureInfo(cultureCode);
if (culture == null)
{
culture = CultureInfo.GetCultureInfo(DefaultCultureCode);
}
您可以编写一个返回布尔值的 DoesCultureExist 方法,如下所示:
private static bool DoesCultureExist(string cultureName)
{
return CultureInfo.GetCultures(CultureTypes.AllCultures).Any(culture => string.Equals(culture.Name, cultureName, StringComparison.CurrentCultureIgnoreCase));
}
我认为没有这样的方法。因此,您可以只try-catch
检查或检查所有已安装的文化:
string cultureCode = "de-DE";
CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures & ~CultureTypes.NeutralCultures);
var culture = cultures.FirstOrDefault(c => c.Name.Equals(cultureCode, StringComparison.OrdinalIgnoreCase));
if (culture == null)
{
culture = cultures.FirstOrDefault(c => c.Name.Equals(DefaultCultureCode, StringComparison.OrdinalIgnoreCase));
if (culture == null)
culture = CultureInfo.CurrentCulture;
}
但我更喜欢try-catch
,我相信它更有效。
public bool TryGetCultureInfo(string cultureCode, string DefaultCultureCode, out CultureInfo culture)
{
try
{
culture = CultureInfo.GetCultureInfo(cultureCode);
return true;
} catch(CultureNotFoundException)
{
if (DefaultCultureCode == null)
culture = CultureInfo.CurrentCulture;
else
{
try
{
culture = CultureInfo.GetCultureInfo(DefaultCultureCode);
} catch (CultureNotFoundException)
{
culture = CultureInfo.CurrentCulture;
}
}
}
return false;
}
如果您希望它更快,您可以使用:
internal static class Culture
{
private static readonly HashSet<string> CultureNames = CreateCultureNames();
internal static bool Exists(string name)
{
return CultureNames.Contains(name);
}
private static HashSet<string> CreateCultureNames()
{
var cultureInfos = CultureInfo.GetCultures(CultureTypes.AllCultures)
.Where(x => !string.IsNullOrEmpty(x.Name))
.ToArray();
var allNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
allNames.UnionWith(cultureInfos.Select(x => x.TwoLetterISOLanguageName));
allNames.UnionWith(cultureInfos.Select(x => x.Name));
return allNames;
}
}
不,AFAIK 是不可能的。您可以先检查文化是否存在,在这种情况下获取它。
以下代码显示了如何执行此操作:
private static CultureInfo GetCulture(string name)
{
if (!CultureExists(name)) return null;
return CultureInfo.GetCultureInfo(name);
}
private static bool CultureExists(string name)
{
CultureInfo[] availableCultures =
CultureInfo.GetCultures(CultureTypes.AllCultures);
foreach (CultureInfo culture in availableCultures)
{
if (culture.Name.Equals(name))
return true;
}
return false;
}
希望能帮助到你