Je me demande s'il est possible d'utiliser la réflexion pour localiser un objet au moment de l'exécution? C'est plus d'expérience qu'une exigence pratique. P>
J'ai utilisé la méthode .getType () sur une instance d'objet pour faire diverses choses à l'objet, mais ma question est la suivante: que si je connais un objet d'un certain type existe au moment de l'exécution, mais je ne peux pas me référer à son nom. p>
comme exemple plus concret, supposons que j'ai une application WinForms qui charge une DLL - comment la DLL pourrait-elle localiser indépendamment une référence à l'objet de formulaire afin d'interagir avec le formulaire ou d'appeler une méthode publique? P>
Est-ce que cela est encore possible? P>
7 Réponses :
non, fondamentalement. p>
Vous pouvez avoir une sorte de carte globale horrible de type à "l'instance du type qui m'intéresse" mais sinon, non. P>
Fondamentalement, l'application WinForms devrait transmettre une référence au formulaire dans la DLL en quelque sorte. P>
Nope Ce n'est pas possible, car les références sont implémentées en privé par Microsoft, elles ne sont pas des pointeurs par rapport à C / C ++, dans Old C / C ++, vous pouvez numériser votre mémoire mais dans .net Il n'y a pas de tels outils. P>
Je n'ai pas compris votre question. Lorsque vous vous référez à un objet, vous voulez dire que vous recherchez une instance d'objet ou faites-vous référence à la recherche d'un type d'objet? P>
Si vous recherchez une instance, la réponse est non. Si vous recherchez un type par nom au moment de l'exécution, la réponse est oui. P>
La ligne suivante vous permettra d'obtenir tous les assemblages chargés dans l'AppDomain: AppDomain.CurrentDomaine.GetAssemblages (); P>
La méthode d'instance Edit: Vous avez oublié que vous connaissiez le nom du type. Vous pouvez également utiliser assembly.getTypes () code> vous obtiendra tous les types d'assemblage. P>
assemblage.getType (nom de chaîne) code>. P>
Vous pouvez concevoir un cadre de plug-in de votre application.
Voici un exemple: alors vous pouvez trouver vos plugins lorsque vous chargez un montage au moment de l'exécution. P> foreach(var type in assembly.GetTypes())
{
if(typeof(IPlugin).IsAssignableFrom(type))
var plugin=(IPlugin)Activator.CreateInstance(type);
plugin.Load(_mainForm);
}
Comme d'autres personnes ont déjà répondu, non, ce n'est pas possible de manière générale.
Mais, pour un scénario plus spécifique, vous pouvez obtenir une liste de toutes les fenêtres de la Win API, puis examiner chacun Pour les propriétés que vous essayez de rechercher. p>
C'est vraiment i> le long chemin. L'objet code> application code> gère tous ceux de la collection code> openForms code> (pour les applications WinForms).
Si vous expérimentez et essayez de localiser le formulaire principal de votre DLL, vous pouvez le faire:
//get the current process System.Diagnostics.Process p = System.Diagnostics.Process.GetCurrentProcess(); //get its main windows handle (only works, if the form is already created) IntPtr hWnd = p.MainWindowHandle; //locate the form by its native handle System.Windows.Forms.Form f = System.Windows.Forms.Form.FromHandle(hWnd) as System.Windows.Forms.Form;
Jon Skeet est correct que ce n'est pas possible pour n'importe quel type arbitraire.
Pour votre exemple concret, c'est possible. Et vous n'avez pas besoin de p / invoquer Enumwindows CODE> ou d'utiliser
form.fromhandle () code> p>
Form f = Application.OpenForms.Where(x => x.GetType().Name == "FormIWant").FirstOrDefault();