Il modo migliore per verificare se System.Type è un discendente di una determinata classe
-
07-07-2019 - |
Domanda
Considera il seguente codice:
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());
}
}
Qual è il modo migliore per implementare IsDescendantOf?
Soluzione
Type.IsSubclassOf () Determina se l'oggetto la classe rappresentata dal tipo corrente deriva dalla classe rappresentata dal tipo specificato.
Altri suggerimenti
Probabilmente stai cercando Type.IsAssignableFrom .
Mi rendo conto che questo non risponde direttamente alla tua domanda, ma potresti prendere in considerazione l'utilizzo di questo invece del metodo nel tuo esempio:
public static bool IsDescendantOf<T>(this object o)
{
if(o == null) throw new ArgumentNullException();
return typeof(T).IsSubclassOf(o.GetType());
}
Quindi puoi usarlo in questo modo:
C c = new C();
c.IsDescendantOf<A>();
Inoltre, per rispondere alla tua domanda sulla differenza tra Type.IsSubclassOf e Type.IsAssignableFrom - IsAssignableFrom è più debole nel senso che se hai due oggetti aeb in modo che ciò sia valido:
a = b;
Quindi typeof (A) .IsAssignableFrom (b.GetType ())
è true - quindi a potrebbe essere una sottoclasse di b o un tipo di interfaccia.
Al contrario, a.GetType (). IsSubclassOf (typeof (B))
restituirà vero solo se a fosse una sottoclasse di b. Dato il nome del tuo metodo di estensione, direi che dovresti usare IsSubclassOf invece di IsAssignable a;
Penso che tu stia cercando questo Type.IsSubclassOf ( )
Modifica:
Non conosco i tuoi requisiti ma potrebbe essere il modo migliore:
bool isDescendant = cValue is C;