2010-11-26 35 views
0

Comment puis-je utiliser la réflexion du type le plus générique d'un constructeur partagé dans la classe de base:type plus spécifique de la base partagée constructeur

Public Class Foo() 
    Shared Sub New() 
     'Here we have code to get the type! 
     MethodBase.GetCurrentMethod().DeclaringType 
    End 
End Class 

Public Class Bar() 
    Inherits Foo 

End Class 

Je pense que le résultat soit Bar type et pas le Foo. C'est possible?

+0

Vous devez être plus précis. Qu'en est-il des types héritant de votre classe dans une autre assemblée que vous ne connaissez pas? Que faire s'il y a plusieurs types au même niveau d'héritage? À quelle profondeur voulez-vous aller? – thecoop

+1

Vous voulez le type le plus * spécifique, non générique ... – Lucero

Répondre

2

D'abord, il semble que vous voulez trouver le plus dérivé de type (ou le plus type spécifique), pas le type le plus générique - qui signifierait plutôt le contraire (non plus, que les médicaments génériques sont impliqués, ou que le type général est recherché).

Bien qu'il soit possible de le faire en utilisant la réflexion, votre besoin pour cela peut indiquer que votre conception de classe est incorrecte ou moins qu'optimale. D'abord, les constructeurs ne sont pas des méthodes virtuelles, donc dans un constructeur (IIRC), la référence d'objet Me est du type qui contient ce constructeur.

Ce que vous pouvez faire est de refléter tous les types d'un assemblage et de trouver tous ceux qui sont dérivés de Foo. Vous devrez alors construire un graphe d'héritage de ces types et assigner un nombre à chaque énonciation jusqu'à quel point il est dérivé de Foo (nombre de niveaux d'héritage). Vous pouvez ensuite vérifier la référence d'objet Me par rapport à tous les types que vous avez identifiés (voir si Me peut être castée dans chacun d'entre eux), et à partir de ce sous-ensemble, choisissez le type avec le plus grand nombre de niveaux d'héritage.

J'espère que de cela, vous verrez que cela ne vaut probablement pas la peine. Il serait plus intéressant, et probablement plus utile, de repenser la raison pour laquelle vous devez le faire et, si possible, de trouver un moyen de l'éviter.