C#.NET - Comment puis-je obtenir typeof() pour travailler avec l'héritage?

Je vais commencer par vous expliquer mon scénario dans le code:

public class A { }

public class B : A { }

public class C : B { }

public class D { }

public class Test
{
    private A a = new A ( ) ;
    private B b = new B ( ) ;
    private C c = new C ( ) ;
    private D d = new D ( ) ;

    public Test ( )
    {
        //Evaluates to "false"
        if ( a.GetType == typeof(B) ) { } //TODO: Add Logic

        //Evaluates to "true"
        if ( b.GetType == typeof(B) ) { } //TODO: Add Logic

        //I WANT this to evaluate to "true"
        if ( c.GetType == typeof(B) ) { } //TODO: Add Logic

        //Evaluates to "false"
        if ( d.GetType == typeof(B) ) { } //TODO: Add Logic
    }
}

La ligne importante à prendre en compte ici est la suivante:

if ( c.GetType == typeof(B) ) { }

Je crois que ce sera bien évaluer pour "de faux", car typeof(B) et typeof(C) ne sont pas égaux les uns aux autres dans les deux directions. C est un B, mais B n'est pas nécessairement un C.)

Mais ce que je besoin est un certain type de condition à prendre en compte. Comment puis-je savoir si un objet est un B ou quoi que ce soit en découlent?

Je ne m'inquiète pas si c'est un objet DÉRIVÉ de B, tant que la base de la classe B est là. Et je ne peux pas prévoir ce que la classe dérivée peut se montrer dans mon application. Je n'ai qu'à supposer que unkown les classes dérivées peuvent exister dans l'avenir - et, par conséquent, je ne peux que visent à assurer que la classe de base est ce que j'attends.

J'ai besoin d'un état qui va effectuer cette vérification pour moi. Comment cela peut-il être réalisé?

Vous devriez éviter ce genre de logique où c'est possible. Lorsque vous devez déterminer le type dérivé d'un objet, vous n'êtes pas en faisant un bon usage de polymorphisme.
Voir mon commentaire sur Steven Sudit de réponse.

OriginalL'auteur Giffyguy | 2009-08-02