如何在.NET中检查存在的文化

我有这个代码,当我试图不存在文化时,我得到例外。
是否存在类似TryGetCultureInfo方法,它返回bool值? 我不想使用try-catch语句

 CultureInfo culture = CultureInfo.GetCultureInfo(cultureCode); if (culture == null) { culture = CultureInfo.GetCultureInfo(DefaultCultureCode); } 

我认为没有这样的方法。 所以你可以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; } 

您可以编写一个DoesCultureExist方法返回一个布尔值,如下所示:

 private static bool DoesCultureExist(string cultureName) { return CultureInfo.GetCultures(CultureTypes.AllCultures).Any(culture => string.Equals(culture.Name, cultureName, StringComparison.CurrentCultureIgnoreCase)); } 

如果你想要它快,你可以使用:

 internal static class Culture { private static readonly HashSet CultureNames = CreateCultureNames(); internal static bool Exists(string name) { return CultureNames.Contains(name); } private static HashSet CreateCultureNames() { var cultureInfos = CultureInfo.GetCultures(CultureTypes.AllCultures) .Where(x => !string.IsNullOrEmpty(x.Name)) .ToArray(); var allNames = new HashSet(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; } 

希望能帮助到你