長い話を簡単にまとめると、Objectインスタンスとして渡される特定のタイプのタスクを実行するC#関数があります。クラスインスタンスが渡されたときは、すべて正常に動作します。しかし、オブジェクトがインターフェイスとして宣言されたとき、具体的なクラスを見つけて、そのクラスタイプに対してアクションを実行したいと思っています。私はPerformActionのコードは、それはパラメータがありますに対してリフレクションを使用して、それがIAのインスタンスだけではないことを見てみたいと思いインターフェイスインスタンスの背後にあるコンクリートタイプを見つける
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
}
:ここ
は(間違ったプロパティケーシングなどと輝く)ユビキタス悪い例です。それはBのインスタンスであり、GetProperties()を介してプロパティ "b"を参照するということです。私が.GetType()を使用すると、IAのタイプが得られます。PerformActionはIAのインスタンスの基礎となる具体的なタイプをどのように決定できますか?
抽象クラスを使用することを示唆したくなるかもしれませんが、それは私の悪い例の単なる制限です。この変数はもともとはインタフェースインスタンスとして宣言されます。
これは悪いデザインのようです。特定の具体的な型についてメソッドに知らせるのではなく、多態性を使用する必要があります。後で追加するとどうなりますか? –
それはインターフェイスの目的を破るものではありませんか?インタフェースを実装している限り、具体的な型が何であるか気にする必要はありません。 –
+1ジョンとクリス、それだけでなく、それは悪いデザインですが、質問は意味をなさない。 –