2010-05-20 5 views
1

Situation étrange ... J'ai besoin de créer une nouvelle instance d'une classe qui a besoin d'un membre de la classe appelante. Mais je ne peux pas passer une référence à la classe appelante à travers le constructeur.Comment puis-je obtenir (est-ce possible) une référence à la classe qui crée une instance d'une autre classe

La solution que je suis à la recherche est quelque chose comme ceci:

Public Class ChildClass 
    Public Sub New(args) 
     _MyMember = GetMemberFromCallingClass() 
     ... 
     ... 
    End Sub 
End Class 

Je veux que cela fonctionne sans avoir à passer manuellement les références ou les variables de la classe d'appel à la nouvelle instance de ChildClass.

Est-ce possible et si oui, que devrais-je regarder pour faire cette partie de mon code.

+0

Une autre option serait si je pouvais en quelque sorte stocker une référence au membre appelant qui pourrait alors être accédé de manière unique à partir d'une classe enfant en fonction du thread dans lequel je suis ou quelque chose comme ça. Faire une méthode comme AssignReference (ByRef ParentClassMember As Object) – Cadde

Répondre

0

Vous faites quelque chose comme le code ci-dessous pour obtenir le type de la classe d'appel:

Dim trace As New System.Diagnostics.StackTrace() 
System.Diagnostics.Debug.WriteLine(trace.GetFrame(1).GetMethod().ReflectedType.Name) 

Vous pouvez ensuite appeler GetMethods ou « GetMember » ou similaire du type réfléchi pour obtenir la méthode réelle que vous voulez . Veuillez noter cependant que ReflectedType retournera toujours la classe de base, donc cela pourrait ne pas fonctionner correctement si votre méthode a été appelée à partir d'une classe enfant, mais qu'elle ne s'en souvient pas.

+0

Je suppose que c'est aussi proche que possible ... Prenant Brian Gideons réponse en compte, je peux obtenir le type de l'appelant, mais pas l'appelant réel Merci pour l'info! – Cadde

0

Si par membre, vous voulez dire que vous voulez appeler une propriété ou une méthode sur l'instance réelle de la classe appelante, alors pas vous ne pouvez pas faire cela. Le mieux que vous puissiez faire est de parcourir la pile via StackTrace pour extraire les informations de type de la classe appelante, mais vous ne pourrez pas extraire l'instance réelle. Si vous voulez que le code d'une autre classe ait accès aux membres d'une instance spécifique d'une autre classe, vous devrez passer cette référence.

Questions connexes