2016-09-05 10 views
1

Я хотел бы создать класс-оболочку для замены базового класса CultureInfo. Например; в моем коде я имеюWrapper for CultureInfo

var cultureInfo = new CultureInfo (stringVariableForCultureName); 

Я хотел бы заменить эту строку для этого другого:

var cultureInfo = new CultureInfoWrapper (stringVariableForCultureName); 

Причина заключается в том, что у меня нет контроля над значением, переданным для инициализации CultureInfo и I хотят, чтобы избежать исключения ошибки дефолта в CultureInfo

Так что мой CultureInfoWrapper конструктор должен быть что-то вроде:

public CultureInfoWrapper(string cultureName) 
{ 
    try 
    { 
     return new CultureInfo(cultureName); 
    } 
    catch (Exception exception) 
    { 
     return new CultureInfo(DefaultCultureName); 
    } 
} 

Можете ли вы помочь мне определить класс обертки?

+0

Поймать исключения, как в своем коде выше, выглядит плохой идеей я, поскольку вы используете исключения для управления потоком программы. Исключения являются плохими для производительности вашего приложения. –

+1

Конструкторы не * возвращают * значение нового типа (и в вашем примере оно возвращает значение другого типа), поэтому ваш план движется в неправильном направлении для начала. –

+0

Я согласен с вами @UweKeim. Я мог бы проверить также, если строка, переданная, является допустимым именем CultureInfo, но все же мне понадобится мой первоначальный запрос, который я могу создать оболочку для класса CultureInfo. – SergioKastro

ответ

5

Вы могли бы использовать эту реализацию, обратите внимание, что я уже обрабатывается CultureNotFoundException:

public class CultureInfoWrapper 
{ 
    private readonly CultureInfo _cultureInfo; 

    public CultureInfo Value 
    { 
     get { return _cultureInfo; } 
    } 

    public CultureInfoWrapper(string cultureName, string fallbackCultureName = "en-US") 
    { 
     try 
     { 
      _cultureInfo = new CultureInfo(cultureName); 
     } 
     catch (CultureNotFoundException) 
     { 
      _cultureInfo = new CultureInfo(fallbackCultureName); 
     } 
    } 
} 

Другой подход будет загружать все культуры один раз, то вы можете использовать эту оптимизированную версию:

public class CultureInfoFinder 
{ 
    private static readonly CultureInfo DefaultCulture = new CultureInfo("en-US"); 

    private static Dictionary<string, CultureInfo> _allSpecificCultures; 

    static CultureInfoFinder() 
    { 
     _allSpecificCultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures) 
      .ToDictionary(c => c.ToString(), c => c, StringComparer.InvariantCultureIgnoreCase); 
    } 

    public static CultureInfo Get(string cultureName) 
    { 
     CultureInfo c; 
     bool knownCulture = _allSpecificCultures.TryGetValue(cultureName, out c); 
     return knownCulture ? c : DefaultCulture; 
    } 
} 

Например:

CultureInfo deDE = CultureInfoFinder.Get("de-DE"); 
+0

Большое спасибо @Tim Schmelter – SergioKastro

+1

@SergioKastro: я добавил еще один подход, который не нужен try-catch –

+0

Еще лучше ;-) – SergioKastro