2011-01-17 21 views
0

にアクセスできません。辞書<文字列、オブジェクトは>私が考えるオブジェクトメンバー

public class BD { 

public int Day {get; set; } 
public int Month {get; set; } 
public int Year {get; set;} 

public BD(int x,int y,int z) { Day=x; Month=y; Year=z; } 
} 

私の問題は、私は日、月を参照することができないということです。

Dictionary<string,Object> dict = new Dictionary<string,Object>(); 

dict.Add("Name","deadlock"); 
dict.Add("Birthday",new BD(12,12,1955)); 

をBDであることを知ります、そのような辞書からの年:

int Day1 = dict["Birthday"].Day; 

上記のコードは機能しません。どんな提案も大歓迎です。

+0

はい、なぜ辞書を使用して文字列タイプとBDタイプを格納していますか? –

+1

'Dictionary 'を作成する必要があります。 – SLaks

+0

@Shanでは、文字列型は格納されません。 stringは、Dictionaryキーのデータ型です。 – deadlock

答えて

4
int Day1 = ((BD)dict["Birthday"]).Day; 

BDオブジェクトにキャストする必要があります。

+0

私は質問をする前にそれを試みました。私はちょうどそれがうまくいかない理由である外の括弧を逃しました。あなたのおかげで今働いています。 – deadlock

1

あなたが使用したい型にオブジェクトをキャストする必要があります。

int Day1 = ((BD) dict["Birthday"]).Day; 
1

それは動作しませんdict["Birthday"]が期待通りにこれを使用するためにはタイプObject

のオブジェクトを返すため、オブジェクトを適切な型にキャストする必要があります。

if(dict["Birthday"] is BD) 
{ 
    var bd = dict["Birthday"]; 
    bd.Day; //do something useful 
} 

//or 
var bd = dict["Birthday"] as BD 
if(bd != null) 
{ 
    bd.Day; //something useful 
} 

しかし、あなたがしているのはクルージングです。コレクションは、同種の型を格納するときに最も効果的です。汎用オブジェクトを格納することで、混合型を確実に格納できますが、キャストする前に型の安全性を保証する責任があります。

1

変数または参照で複数のデータ型が常に再生されていますが、インスタンスメンバーは1つのデータ型(および継承したもの)の目のみでフィルタリングされます。したがって、一度に記述された(宣言された)データ型。次に、コンパイラは、その時点で何のデータ型が処理されているかを知っています。

あなたのケースでは、BDのインスタンスはすべて、継承を介してBDおよびSystem.Objectのすべてのタイプです。インタフェースが実装されていれば、そのインスタンスも追加のデータ型になります。

ただし、データ型がBDの場合でも、タイプObjectにはオブジェクトメンバー(および継承したもの、それ以上は何もありません)のみが表示されます。

C#コンパイラに、使用可能なデータ型の意図を明示するには、C#/ .NETのようなメカニズムの1つを使用して、 "downcast"、キャスト、変換する必要があります。C#キャスト((BD)dict["Birthday"]).Day;、互換参照タイプ間の明示的変換(dict["Birthday"] as BD).Day;。基本データ型の場合、コンバージョンを使用することもできます。 System.Convert.ToInt32(myLongValue)。より多くの機能が.NETに存在し、変換作業をサポートします。

関連する問題