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é?
Voir mon commentaire sur Steven Sudit de réponse.
OriginalL'auteur Giffyguy | 2009-08-02
Vous devez vous connecter pour publier un commentaire.
Vous pouvez simplement utiliser
is
:Ah, c'est vrai. Vous avez raison, ma question est un peu fuddled. Mon mauvais.
+1 C'est la bonne solution à ce problème.
OriginalL'auteur cdm9002
Edit: ceci répond à la question dans le titre du fil. cdm9002 a la meilleure réponse au problème comme décrit dans le post complet.
Si vous souhaitez obtenir technique, l'autre réponse n'utilise pas
typeof
avec l'héritage. Comme vous pouvez le voir dans mon edit, je ne suis pas seul à réclamer la première réponse que j'ai pensé est le plus approprié. 🙂Ce n'est pas seulement une parfaite réponse correcte, mais aussi en outre couvre le cas où vous n'avez pas le cas de toute les classes à la main, mais que vous voulez toujours de déterminer s'il existe une relation d'héritage entre les deux types.
OriginalL'auteur Sam Harwell
Cela ressemble à un travail pour le polymorphisme, par opposition à une grande instruction switch avec des tests pour des classes spécifiques.
Comment impoli!! Haha. Ma logique de classe n'a pas vraiment l'air de ce gâchis. J'ai juste besoin de comprendre comment effectuer cette condition. Je suis en train d'écrire un PropertyChangedCallback méthode DANS la classe de base abstraite, et j'ai besoin d'une sécurité de l'état à assurer que le DependencyObject paramètre est un objet dérivé de ma classe de base. Si pas, je jette une erreur ou d'annuler ma logique. Le polymorphisme n'est pas utile dans ce cas.
Ok, alors à l'aide de "est" devrait suffire.
OriginalL'auteur Steven Sudit
Comme une alternative à la
(c is B)
vérifier, vous pouvez également effectuer les opérations suivantes:C'est préférable, dans certains cas, depuis des afin de rendre l'utilisation de
c
comme unB
lors de l'utilisation deis
, vous avez à jeter de toute façon.OriginalL'auteur Dave Cousineau
Pour VB.NET avec Visual Studio; 2008, vous pouvez le vérifier comme:
OriginalL'auteur Guest
Similaire à la réponse ci-dessus à partir de sam-harwell, parfois vous pouvez avoir le type "B" dans une variable, vous devez utiliser la réflexion plutôt que le "est" de l'opérateur.
J'ai utilisé de Sam solution, et a été agréablement surpris lors de Resharper a fait cette suggestion.
OriginalL'auteur David Chiew