2016-09-05 11 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 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; 
    } 
} 

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); 
     } 
    } 
} 
別のアプローチは、一度すべての文化を読み込むことであろう

は、その後、あなたは、この最適化されたバージョンを使用することができます

例:

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

ありがとう@Tim Schmelter – SergioKastro

+1

@SergioKastro:私はtry-catchを必要としない別のアプローチを追加しました –

+0

さらに良い;-) – SergioKastro