Meilleur moyen de vérifier si System.Type est un descendant d'une classe donnée
-
07-07-2019 - |
Question
Considérez le code suivant:
public class A
{
}
public class B : A
{
}
public class C : B
{
}
class D
{
public static bool IsDescendantOf(this System.Type thisType, System.Type thatType)
{
/// ???
}
void Main()
{
A cValue = new C();
C.GetType().IsDescendantOf(cValue.GetType());
}
}
Quel est le meilleur moyen d'implémenter IsDescendantOf?
La solution
Type.IsSubclassOf () Détermine si le La classe représentée par le Type actuel dérive de la classe représentée par le Type spécifié.
Autres conseils
Vous recherchez probablement Type.IsAssignableFrom .
Je réalise que cela ne répond pas directement à votre question, mais vous pouvez envisager d'utiliser ceci à la place de la méthode de votre exemple:
public static bool IsDescendantOf<T>(this object o)
{
if(o == null) throw new ArgumentNullException();
return typeof(T).IsSubclassOf(o.GetType());
}
Vous pouvez donc l'utiliser comme ceci:
C c = new C();
c.IsDescendantOf<A>();
En outre, pour répondre à votre question sur la différence entre Type.IsSubclassOf et Type.IsAssignableFrom - IsAssignableFrom est plus faible en ce sens que si vous avez deux objets a et b tels que ceux-ci sont valides:
a = b;
Alors typeof (A) .IsAssignableFrom (b.GetType ())
est true - donc a pourrait être une sous-classe de b ou un type d'interface.
En revanche, a.GetType (). IsSubclassOf (typeof (B))
ne renverrait true que si a était une sous-classe de b. Étant donné le nom de votre méthode d'extension, je dirais que vous devriez utiliser IsSubclassOf au lieu de IsAssignable à
Je pense que vous recherchez ce Type.IsSubclassOf ( )
Modifier:
Je ne connais pas vos exigences, mais c’est peut-être le meilleur moyen:
bool isDescendant = cValue is C;