C'è un po 'di problemi con questa idea, tuttavia, dato che ogni oggetto (e, di fatto, ogni tipo) ha una classe base comune, Object. Quello che devi definire è fino a che punto della catena di successione vuoi andare (se sono o sono gli stessi o hanno lo stesso genitore immediato, o uno è il genitore diretto dell'altro, ecc.) E fai il tuo controlla in questo modo. IsAssignableFrom
è utile per determinare se i tipi sono compatibili tra loro, ma non stabilirà completamente se hanno lo stesso genitore (se è quello che cerchi).
Se i criteri rigorosi è che la funzione dovrebbe restituire vero se ...
- I tipi sono identici
- Un tipo è il genitore (immediata o meno) degli altri
- I due tipi hanno lo stesso padre immediato
Si potrebbe utilizzare
private bool AreSame(Type a, Type b)
{
if(a == b) return true; // Either both are null or they are the same type
if(a == null || b == null) return false;
if(a.IsSubclassOf(b) || b.IsSubclassOf(a)) return true; // One inherits from the other
return a.BaseType == b.BaseType; // They have the same immediate parent
}
fonte
2009-04-02 04:28:28
+1 Non ero a conoscenza di questa pratica funzione IsAssignableFrom, dovrò tenerlo a mente. – James
Ci sono molte cose utili nella gerarchia di Reflection! È interessante sfogliare l'elenco dei membri: è molto probabile che troverai ciò di cui hai bisogno. Leggi i documenti, però. Ad esempio, IsAssignableFrom restituirebbe true se t era un tipo generico param e u era un vincolo. –
Solo per FYI, tuttavia, questo non restituirà true se le due classi hanno la stessa classe base. –