2011-01-09 8 views
0

などの一般的な配列を持つ辞書、私は次の宣言で辞書を使いたい:私のクラスの操作は、すべての一般的なタイプのため、全く同じなのでC#の私のクラスで値

Dictionary<string, T[]>

、私はクラスをジェネリックとして定義したくありません(つまり、辞書に挿入するジェネリックタイプごとに別のクラスインスタンスを作成する必要があります)。私がしようとしています

1つの代替ではなくDictionary<string, object>を使用することです:

public void Add<T>(string str, T value) 
{ 
    // Assuming key already exists 
    var array = (T[]) dictionary[str]; 
    array[0] = value; 
} 

はしかし、辞書を反復処理するとき、どのように私は戻って、配列にオブジェクト値をキャストしていますか?

foreach(string strKey in dictionary.Keys) 
{ 
    var array = (T[]) dictionary[strKey]; // How to cast here ? 
    //... 
    array[0] = default(T); 
} 

ありがとうございます。

+1

あなたがしようとしていることを知ることは素晴らしいことでしょう。 –

+0

「オブジェクトをジェネリック型にキャストする」とはどういう意味ですか? – Ani

+0

'indexInArray'はどこから来たのですか? – Mehrdad

答えて

2

T[]にキャストしないでください。System.Array、すべての配列の基本クラスを使用します。あなたが特定の配列型にキャストすることなく行うことができます

var dictionary = new Dictionary<string, Array>(); 
foreach(var item in dictionary) 
    item.Value.SetValue(null, 0); 

その他の動作はArray.ClearBuffer.BlockCopyです。

+0

+1:ニース。私は、「これはバリュー型では機能しません」と言っていましたが、「SetValueを使って値型の配列の要素にnullを代入すると、その要素のすべてのフィールドが初期化されますゼロまで。 http://msdn.microsoft.com/en-us/library/kk3bwkb0.aspx – Ani

+0

@Ani:まったく。それは私が答えを考えている間、私はしばらく心配していましたが。 –

+0

ありがとうございます。一般的なケースでは、どのように私はTのデフォルトにリセットすることができます:item.Value.SetValue(デフォルト(T)、0)? – alhazen

2

は私のクラスの動作を正確に すべての一般的なタイプのあなたは何ができるか

について同じであるため、インタフェースが同じであるすべてのメソッドを定義し、一般的なクラスに実装しますですそのインタフェース。いったんこれを行うと、ストリングをキーとタイプInterfaceNameの配列として取る辞書を作成するだけです。これにより、objectの代わりに一般的な値を持つことができ、キャストも入力する必要はありません。

+0

私の場合、Tは常に値型です。つまり、辞書の値は通常ですint []またはfloat [] – alhazen

+0

"操作が同じです"は、コレクション内の配列の要素に対する操作ではなく、そのコレクション上の操作について説明しているようです。 –

1

汎用クラスを使用する必要があります。辞書から取り出されたオブジェクトがタイプセーフであり、キャストを必要としない場合に汎用クラスを使用する利点は、すでに必要な型のものです。

あなたは、「私のクラスの操作は、すべてのジェネリック型で全く同じです」と言います - それが意味するとは、単にあなたの場合にジェネリッククラスの有用性を補強しているということです。

+0

私は質問を読んで、彼は配列のコレクションを持っています。配列はすべて同じ型ではないため、コレクションを含むコレクションを一般的にすることは役に立ちません。 –

+0

@Ben Voigt - 興味深い、私はそれを読んでいないが、あなたが意味するものを参照してください。私は 'Dictionary <文字列、オブジェクト[]>'と同じではない、 'Dictionary 'という宣言に焦点を当てていました。 –

関連する問題