2011-07-08 2 views
2

SQLに値を格納し、後で分析のために値を取得するプロジェクトがあります。保存されるかもしれない値のどのような種類のトラックを維持するために、私は大体このようなクラスを作成しました:変数型を格納し、それを使用して実行時にコレクションを作成する

private class DataField 
{ 
    public string FieldName; 
    public string FieldType; 
} 

値は、分析のために読まれている場合は、次のように、switchステートメントは、(単純化)に使用されます。

switch (DataField.FieldType) 
{ 
    case "int": 
     List<int> InputData = new List<int>(); 
     // Populate list from DB 
    break; 
    case "bool": 
     List<bool> InputData = new List<bool>(); 
     // Populate list from DB 
    break; 
} 

複数の場所にコードを保持するのではなく、switch文を取り除く方法を探していますが、これは型に基づいてコレクションを動的に作成する必要があることを意味します。現在、そのタイプは(?単純に)文字列ですが、私は、クラスを変更することで、これを改善することができると思う:

private class ImprovedDataField 
{ 
    public string FieldName; 
    public Type FieldType; 
} 

をそして動的に何とかコレクションを作成します。もちろん

Type DataType = typeof(DataField.FieldType); 
List<DataType> InputData = new List<DataType>(); 
// Populate list from DB 

これは動作しません。結果としてType or namespace name expectedというエラーが発生します。

残念ながら、Typeクラス、またはジェネリックスも匿名タイプの作業にも精通していません(解決策はありません)。

コードの重複を減らすにはどうすればよいですか?各switch文分岐の唯一の違いは、生成される変数コレクションのタイプです。

+0

可能重複(http://stackoverflow.com/questions/2078914/c-sharp-dynamic-generic-type) – nawfal

答えて

4

実行時に既知の型のオブジェクトの静的型コレクションを作成する場合は、リフレクションを使用する必要があります。参照してください。つまりthis blog entry - それはList<T>を作成するためのソリューションです:あなたの例ではそう

public static IList CreateGenericList(Type collectionType) 
{ 
    var listType = typeof(List<>).MakeGenericType(new[] { collectionType}); 
    return (IList) Activator.CreateInstance(listType); 
} 

Type dataType = DataField.FieldType; 
IList inputData = CreateGenericList(dataType); 
// Populate list from DB 
+0

+1。私はこれを入力するためにここに来た:)。ただし、「DBからリストを取り込む」ステップを抽象化する方法を検討することを忘れないでください。なぜなら、switch文などを使用すると、その目的を破ることになるからです。 – OpticalDelusion

+0

@A:これは非常に有用であり、なぜ私は受け入れられたとマークしたのですか?私は 'MyObject'に' object'型が含まれている 'List 'を作成し、データを取得するメソッドに引数としてTypeを渡し、本質的にswitchステートメントをはるかに小さく保守性の高いセクションに移動して問題を解決しました。 – JYelton

0

は、なぜあなたは型付きコレクションが必要なのでしょうか?なぜArrayListを使用しないのですか? [C#動的ジェネリック型]の

ArrayList list = new ArrayList() 

list.Add(/* value read from database */) 
+0

おそらく、型付きのコレクションである必要はありません。あなたは何を意味するのかの例を見せてもらえますか? – JYelton

+0

私は彼がFieldName(データベースからデータを取得するために使用すると仮定している)を持っているので、実際にデータのタイプを知る必要は全くありません。 ICollection かArrayListかどうかにかかわらず、データを取り出して何にでも格納することができます。 – OpticalDelusion

関連する問題