2012-03-21 12 views
108

このメソッドを汎用的にして文字列、bool、int、doubleを返す方法はありますか?今、文字列を返していますが、設定値として "true"または "false"を見つけることができれば、たとえばboolを返したいと思います。メソッドの戻り値の型をジェネリックにするにはどうすればよいですか?

public static string ConfigSetting(string settingName) 
    { 
     return ConfigurationManager.AppSettings[settingName]; 
    } 
+0

(Uのタイプはエラーから私たちを救うためにIConvertibleでなければならない)、ここでどこの制約に注意してください。それぞれの設定はどんなタイプですか? – thecoshman

+2

本当に質問したい質問は、「アプリケーションの設定を強く入力するにはどうすればよいですか?」という質問です。私はそれを使って適切な答えを書くのは長すぎる。 – Simon

+0

Yah、理想的には、型をメソッドに渡す必要はありません。私は私が言及した4つのタイプを持つつもりです。 "true"/"false"が設定されている場合、この関数は(メソッドに渡す必要がない)ブール値を返すようにしたいと思います。おそらくintとdoubleを組み合わせてdoubleにすることができます。すでに答えられているものは正常に動作しますが、毎回タイプを渡す必要がありますが、これはおそらく問題ありません。 – MacGyver

答えて

234

あなたは、このような一般的な方法で、行う必要があります。

public static T ConfigSetting<T>(string settingName) 
{ 
    return /* code to convert the setting to T... */ 
} 

しかしは、彼らが期待するタイプを指定する必要があります、発信者。あなたはConvert.ChangeType()を使用することができ

+10

/*設定をT ... *に変換するコード/ここに小説全体が続きます:) –

+1

これは、取得したい設定の種類を知る必要はありませんが、これは可能ではないでしょうか。 – thecoshman

+0

@thecoshman:OP *がジェネリックメソッドを要求したので、これは私が与えたことですが、呼び出し元*が関連する型を知る必要があるという警告があります。 –

20

...、私はすべてこれは良い考えであることを完全に確信していない

public static T ConfigSetting<T>(string settingName) 
{ 
    object value = ConfigurationManager.AppSettings[settingName]; 
    return (T) Convert.ChangeType(value, typeof(T)); 
} 

あなたの心:あなたはその後、潜在的に関連するすべてのタイプがサポートされていることを想定し、Convert.ChangeTypeを使用することができます:

public static T ConfigSetting<T>(string settingName) 
{ 
    return (T)Convert.ChangeType(ConfigurationManager.AppSettings[settingName], typeof(T)); 
} 
-1
private static T[] prepareArray<T>(T[] arrayToCopy, T value) 
    { 
     Array.Copy(arrayToCopy, 1, arrayToCopy, 0, arrayToCopy.Length - 1); 
     arrayToCopy[arrayToCopy.Length - 1] = value; 
     return (T[])arrayToCopy; 
    } 

私は私のコード全体でこれを実行すると、メソッドにそれを置くための方法を望んでいました。私は戻り値にConvert.ChangeTypeを使用する必要がなかったので、ここでこれを共有したいと思います。これはベストプラクティスではないかもしれないが、それは私のために働いた。このメソッドは、配列の末尾に追加する汎用タイプと値の配列を取ります。その後、最初の値を削除して配列をコピーし、メソッドの値を配列の末尾に追加します。最後のことは、汎用配列を返すことです。

0

(OPの問題に固有の優先順位によってリストされている)、これを行うための多くの方法

  1. オプション1 /ストレートなアプローチがあります - あなたはかなり一般的なものを持つよりも、期待タイプごとに複数の関数を作成します。関数。

    public static bool ConfigSettingInt(string settingName) 
    { 
        return Convert.ToBoolean(ConfigurationManager.AppSettings[settingName]); 
    } 
    
  2. オプション2 /あなたが変換の派手な方法を使用したくない - ジェネリック型に、オブジェクトとする値をキャストします。

    public static T ConfigSetting<T>(string settingName) 
    { 
        return (T)(object)ConfigurationManager.AppSettings[settingName]; 
    } 
    

    注 -キャストは(あなたのケース)有効でない場合、これはエラーをスローします。タイプキャストについてわからない場合は、オプション3に行くことをお勧めしません。

  3. オプション3 /汎用タイプの安全性 - タイプ変換を処理する汎用関数を作成します。

    ​​

    注 - Tが予想される型である、あなたが知っているための方法があります

+0

3番目のオプションを 'U'で汎用化するのはなぜですか?そうすることには意味がなく、メソッドを呼び出すのが難しくなります。代わりに 'IConvertible'を受け入れてください。私はそれが質問されている質問に答えることができないので、この質問の第2のオプションを含めることは価値があるとは思わない。おそらく、最初のオプションでメソッドの名前を変更する必要があります... –

関連する問題