3

さまざまなクラスを割り当てることができるオブジェクトがあり、そのすべてにPosition、オブジェクトのタイプに関係なくアクセスする必要があるフィールドがあります。フィールドがないため、Visual Studio でコンパイルvar pos = myObject.PositionできobjectませんPositionMyClassまた、その変数に割り当てられた他のクラスがいくつかある可能性があるため、にキャストできません。

Position1 つの型にキャストせずにフィールドにアクセスするにはどうすればよいですか?

4

3 に答える 3

5

最良のオプションは、すべてのクラスに共通のインターフェイスを実装させ、そのインターフェイスを使用してプロパティにアクセスすることです。

ただし、これらが制御できないクラスである場合は、他のオプションがあります。Reflection を使用してフィールド/プロパティに ( Type.GetFieldおよびFieldInfo.GetValueなどを介して) アクセスできますが、これは実行時に時間がかかります。

C# 4 以降を使用している場合は、次を使用できますdynamic

dynamic theObject = yourObject;
Point position = theObject.Position;

これにより、動的 (ランタイム) バインディングを使用Positionして、型のプロパティまたはフィールドが検索されます。

于 2012-11-16T22:12:08.467 に答える
1

フィールドを持つこれらの異なるクラスはすべて、Positionそのフィールドを共通の基本クラスから継承するか、共通のインターフェイスから取得する必要があります (その場合はプロパティである必要があります)。

インターフェイス ソリューションは次のようになります。

interface IHasPosition
{
  int Position { get; }
}

次に、すべてのクラスが と言う必要があり、コードで変数の型を宣言する必要があり: IHasPositionます。myObjectIHasPosition

于 2012-11-16T22:14:17.900 に答える
0

1 つのオプションは、定義されているクラスからすべての異なるクラスを継承させることでありPosition、オブジェクトを取得すると、親クラスの型によって参照され、特定の型を知らなくてもそこで定義されているプロパティにアクセスできます。

共通の機能があまりない場合、これはあまり良いアプローチではない可能性があることに注意してください。

于 2012-11-16T22:12:49.463 に答える