0

たとえば、2つのクラスがあります。

Class A
{
  string property1;
  string property2;
}

Class B : A
{
  string property3;
  string property4;
  ....
} 

したがって、BはクラスAのプロパティを継承します。彼らはリストに座っています、それは辞書に座っています

Dictionary <string, List<A>> myDictionary = new Dictionary<string, List<A>>();

List<A> myList = new List<A>();

多くのリストを含む1つの辞書があり、すべてにクラスAとBのオブジェクトが混在しています。ループ中に、クラスBオブジェクトからいくつかのプロパティにアクセスしようとしていますが、それらを見つけるためのifステートメントがありますが、プログラムはそれらがクラスA型であると見なし、property3またはproperty4を使用しようとするとエラーをスローします。例えば:

string key = string key in dictionary;
string index = object position in list;

myDictionary[key][index].property3.someMethod();

これがクラスBオブジェクトであることをプログラムに通知し、プロパティ3と4を使用できるようにする方法はありますか?

4

1 に答える 1

5

オブジェクトをBタイプのオブジェクトとして安全にキャストしてから、nullをチェックします

var obj = myDictionary[key][index];

var bObj = obj as B;
if (bObj != null)
{
     bObj.someMethod();
}

とはいえ、あなたのデザインがずれているようにも思えるかもしれません。通常、私はこのようなことを期待していません。通常、継承を使用している場合は、それらを交換して使用できるようにする設計が必要になります。たとえば、Aでの動作をノーオペレーションとして実装し、実際に何かを行うためにBでそれをオーバーライドする場合があります。これにより、消費するクラスは、「A」のものが実際にAインスタンスであるかBインスタンスであるかを気にする必要がなくなります。

于 2012-11-21T22:27:44.200 に答える