2009-05-08 10 views
4

私は任意の数のオブジェクトを含むことができるハッシュテーブルを持っています。これらのオブジェクトはすべて、いくつかの同様のメソッド/プロパティと独自のメソッドを実装しています。不明な類似のオブジェクトのハッシュテーブルを使って作業する(C#)

たとえば、ハッシュテーブル内のすべてのオブジェクトには、文字列型の単一のパラメータを取るPrintTextというメソッドがあります。しかし、すべてのオブジェクトは異なるクラスからインスタンス化されます。

ハッシュテーブルからそのキーで特定のオブジェクトを取り出し、実行前にその型を知らなくても、共通のメソッドやプロパティにアクセスすることはできますか?私のような何かをするだろう。通常

MyClassのTheObject = MyHashTable [キー]。

しかし、引き出されるオブジェクトはどのクラスからも派生する可能性があるので、このインスタンスではできません。

+0

フェアあなたはおそらくすべてのasp.netリレーションシップを破棄することができます。実際にはASP.NETにはまったく関係しません。 –

答えて

9

共通のメソッドとプロパティを含むインターフェイスを定義し、このインターフェイスをすべてのクラスに実装できます。次に、これらのメソッドとプロパティに簡単にアクセスできます。

しかし、オブジェクトの特定のメソッド(インターフェイスに含まれていない)にアクセスするには、そのオブジェクトのタイプを知る必要があります。

更新:

それはあなたの質問から明らかではないが、あなたはハッシュテーブルについて書くとき、私はあなたがHashtable classを意味すると仮定します。その場合は、generic Dictionary class(.NET 2.0以降で利用可能)をご覧ください。このクラスは、コードのタイプセーフを作成し、タイプキャストの多くからあなたを節約でき、例えばます:

IMyInterface a = new MyObject(); 

// with Hashtable 
Hashtable ht = new Hashtable(); 
ht.Add("key", a); 
IMyInterface b = (IMyInterface)ht["key"]; 

// with Dictionary 
var dic = new Dictionary<string, IMyInterface>(); 
dic.Add("key", a); 
// no cast required, value objects are of type IMyInterface : 
IMyInterface c = dic["key"]; 
+0

まさに私が必要としていたもの、マーティンに感謝します。私はインターフェイスがこのように使用されることを認識しませんでした! –

1

あなたが同じインターフェイスを実装するために、あなたのクラスを作ることによって解決することができ、共通のメソッドとプロパティの問題を解決するために。しかし、私はあなたが非共通のメンバーにアクセスする方法を見ていません。あなたは反射を使用しようとすることができます。

1

ダイナミックC#4以前のバージョンでのリフレクション。

EDIT:共通のインターフェースを定義することは、あなたが記述した性質を達成するための効率的かつ明確な方法の両方になることがあります。 (受け入れ答えおよび/またはそれを言及する他の人が「インスピレーションを得た」 - タイムラインを思い出すことができない)

+0

ダックタイピングがうまくいく間に、(受け入れられた回答に従って)インターフェイスが非常に好ましいでしょう。ほとんどの場合、ダイナミックは最後の手段と見なされるべきです(ただし、COM/DLRの方がずっと便利です)。しかし、それに言及して+1。 –

+0

はい、同意します。 (また、私は他のレスポンスからのインターフェイスへの参照を入れたが、EDITをテキストの前に置くことで宣言しなかった(編集の説明では開いていたが) –

0

あなたが言うことができます:

object theObject = MyHashTable[Key]; 

を次に、あなたが言うことができる:

theObject.GetType() 
    .GetMethod("PrintText") 
    .Invoke(theObject, new object[] {"paramvalue"}); 
関連する問題