我有这样的代码,当我试图得到不存在的文化,我得到异常。是否存在类似TryGetCultureInfo的方法,返回bool值?我不想使用try-catch语句
TryGetCultureInfo
bool
try-catch
CultureInfo culture = CultureInfo.GetCultureInfo(cultureCode); if (culture == null) { culture = CultureInfo.GetCultureInfo(DefaultCultureCode); }
字符串
jjhzyzn01#
你可以写一个DoesCultureExist方法,返回一个布尔值,就像这样:
private static bool DoesCultureExist(string cultureName) { return CultureInfo.GetCultures(CultureTypes.AllCultures).Any(culture => string.Equals(culture.Name, cultureName, StringComparison.CurrentCultureIgnoreCase)); }
pvabu6sv2#
我认为没有这样的方法。因此,您可以只使用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; }
型
cgvd09ve3#
如果你想让它更快,你可以用途:
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; } }
8wtpewkr4#
不,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; }
字符串希望有帮助
pepwfjgg5#
对于那些可能感兴趣的人来说,从.NET 5开始,这个重载确实做到了这一点(有效地调用Nls或Icu本机API)。
5条答案
按热度按时间jjhzyzn01#
你可以写一个DoesCultureExist方法,返回一个布尔值,就像这样:
字符串
pvabu6sv2#
我认为没有这样的方法。因此,您可以只使用
try-catch
或检查所有已安装的区域性:字符串
但我更喜欢
try-catch
,我相信它更有效。型
cgvd09ve3#
如果你想让它更快,你可以用途:
字符串
8wtpewkr4#
不,AFAIK不可能。您可以先检查该区域性是否存在,如果存在,则获取它。
下面的代码显示了如何执行此操作:
字符串
希望有帮助
pepwfjgg5#
对于那些可能感兴趣的人来说,从.NET 5开始,这个重载确实做到了这一点(有效地调用Nls或Icu本机API)。