• ベストアンサー

[C#]Hashtableの値として保持されているHashtableの値へのアクセス

System.Collections.Hashtable hashtable = new System.Collections.Hashtable (); hashtable["test1"] = new System.Collections.Hashtable (); hashtable["test1"]["test2"] = "テストデータ"; に相当する動作をする書き方はどうすればよいでしょうか? 代入した値の取り出しをしたいので探している解は System.Collections.Hashtable hashtable = new System.Collections.Hashtable (); System.Collections.Hashtable hashtable2 = new System.Collections.Hashtable (); hashtable2["test2"] = "テストデータ"; hashtable["test1"] = hashtable2; ではありません. 変数 = hashtable["test1"]["test2"]; に相当する捜査の方法も一緒にお願いします.

質問者が選んだベストアンサー

  • ベストアンサー
  • furyfox
  • ベストアンサー率56% (58/103)
回答No.4

>System.Collections.Hashtableでなければならない >System.Collections.HashtableにキャストしSystem.Collections.Hashtableでリターンしたいのです. 変数 = hashtable["test1"]["test2"]; 結論からいうとSystem.Collections.Hashtableでの実装は無理です。 理由はHashtable.ItemはObject型なわけですからです。 変数 = hashtable["test1"]["test2"];のようにしたいのなら int a; if (hashtable["test1"] is System.Collections.Hashtable){ a = (int)(hashtable["test1"] as System.Collections.Hashtable)["test2"] } という書き方が必要です。 hashtable["test1"] ができるのは Hashtableがpublic virtual Object this[Object key]というItemプロパティ と呼ばれるプロパティを持っているからです。 その型の何かのメソッドを呼びたいのなら、リフレクションを使って obj.GetType().InvokeMember("メソッド名" , BindingFlags.InvokeMethod,null,null.args); という書き方はできます。 hashtable["test1"]の部分を呼びたいのならGetPropertiesで Itemというプロパティ名で登録されているので それを呼べば同じ処理を呼ぶことができます。

izayoimizuki
質問者

補足

ありがとうございます. やはり...Hashtableでは無理ですか... 皆様の回答を参考に代替手段を考えます.

その他の回答 (3)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

ちょっと補足です。 >string val = a["a"]["b"]; >a["a"]["b"] = "c"; >も可能です。 http://oshiete1.goo.ne.jp/qa2761267.html ですが a["a"]["b"]とする書き方はできますが制約があるので a["a","b"]と書くことでアクセス(set,get)しています。

izayoimizuki
質問者

補足

ありがとうございます. System.Collections.Hashtableでなければならない事情があります. また...object型でリターンしたのでは私が回避したい問題そのものにぶつかってしまいます. ですからobject型でリターンはしたくありません. あくまでvalueの.GetType()の結果がstringであればstringにキャストしてstringでリターンし System.Collections.HashtableであればSystem.Collections.HashtableにキャストしSystem.Collections.Hashtableでリターンしたいのです. 子クラスにのみ存在するメソッドやプロパティ,フィールドの使用が必要ですので. もちろん適切な型にキャストできれば良いので型が取得できればGetType()メソッドを使う必要はありません.

  • furyfox
  • ベストアンサー率56% (58/103)
回答No.2

val = a[1][1]; と書いた例が悪かったかもしれませんが Dictionaryはジェネリックなので string val = a["a"]["b"]; a["a"]["b"] = "c"; も可能です。 >キャスト後の型が不明なのでジェネリックも使えない状況です object型を指定すればどの型でも入ると思いますが? Dictionary<object> dictionary;

  • furyfox
  • ベストアンサー率56% (58/103)
回答No.1

私もval = a[1][1];といった記述をしたく 以前同じような質問をしました。 http://oshiete1.goo.ne.jp/qa2761267.html HashtableではなくDictionaryですが 参考になると思います。

izayoimizuki
質問者

お礼

ありがとうございます. う~ん...何となく状況が違うと思います. どうも私が直面している状況を洗いなおしてみると 期待値:System.Collections.Hashtable型 実際値:object型 なのでとりあえず ((System.Collections.Hashtable)hashtable["test"])["test"] で何とかなりそうです. ただ...GetType()の結果を使えないので型が不明だとどうにもならなくなってしまいます. 関数化するにも実行してみないとキャスト後の型が不明なのでジェネリックも使えない状況です. 何か良い方法はないものでしょうか?

関連するQ&A