簡単に言うと、Objectインスタンスとして渡される特定のタイプでタスクを実行するC#関数があります。クラスインスタンスが渡されると、すべて正常に機能します。ただし、オブジェクトがインターフェイスとして宣言されている場合は、具体的なクラスを見つけて、そのクラスタイプに対してアクションを実行したいと思います。
これは至る所にある悪い例です(間違ったプロパティケーシングなどで見事です):
public interface IA
{
int a { get; set; }
}
public class B : IA
{
public int a { get; set; }
public int b { get; set; }
}
public class C : IA
{
public int a { get; set; }
public int c { get; set; }
}
// snip
IA myBObject = new B();
PerformAction(myBObject);
IA myCObject = new C();
PerformAction(myCObject);
// snip
void PerformAction(object myObject)
{
Type objectType = myObject.GetType(); // Here is where I get typeof(IA)
if ( objectType.IsInterface )
{
// I want to determine the actual Concrete Type, i.e. either B or C
// objectType = DetermineConcreteType(objectType);
}
// snip - other actions on objectType
}
PerformActionのコードで、そのパラメーターに対してReflectionを使用し、それがIAのインスタンスであるだけでなく、Bのインスタンスであることを確認し、GetProperties()を介してプロパティ「b」を確認したいと思います。.GetType()を使用すると、IAのタイプを取得します-必要なものではありません。
PerformActionは、IAのインスタンスの基になる具象タイプをどのように判別できますか?
抽象クラスの使用を提案したくなる人もいるかもしれませんが、それは私の悪い例の限界にすぎません。変数は元々、インターフェースインスタンスとして宣言されます。