2009-12-30 8 views
3

est-il possible en C# d'obtenir un objet par son nom?C#: comment obtenir un objet par le nom stocké dans String?

à savoir obtenir this.obj0 utilisant

string objectName = "obj0"; 
executeSomeFunctionOnObject(this.someLoadObjectByName(objectName)); 
+1

Pouvez-vous donner un exemple de la façon dont ce nom doit correspondre à l'objet? Recherchez-vous une instance d'objet ou un type? Voulez-vous des instances existantes ou en créer de nouvelles? –

Répondre

8

Non, ce n'est pas.

Les objets n'ont pas de noms - les variables le font. Un objet peut être référencé par n'importe quel nombre de variables: zéro, un ou plusieurs.

Ce que vous pouvez faire, cependant, est d'obtenir des champs (variables statiques ou d'instance) par nom (en utilisant Type.GetField) et obtenir les valeurs de ces champs (pour une instance spécifique, si vous utilisez des variables d'instance). En fonction de ce que vous essayez de faire, vous pouvez également envisager un dictionnaire de noms à objets. Non, tous les objets n'ont pas de propriété Name (pour les démarreurs).

+0

Il est rare que quelqu'un dise clairement qu'il ne peut pas être fait pour que vous puissiez passer à autre chose. Merci. –

1

Mais vous pouvez stocker des objets d'intérêt dans un Dictionary<string, object>. Vous pouvez également obtenir un contrôle par nom, la méthode exacte dépend de la bibliothèque de l'interface utilisateur.

0

Vous ne pouvez pas accéder à un objet par son nom. En utilisant la réflexion, cependant, vous pouvez tous les champs et propriétés d'une classe (par nom, si vous voulez). Si votre objet est stocké dans une variable de terrain ou dans une propriété, cela vous donnera ce que vous voulez:

Type myType = typeof(MyClass); 
FieldInfo[] myFields = myType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); 

PropertyInfo[] myproperties = myType.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); 

Vous pouvez également appeler GetField et GetProperty (singulier) et passer dans une chaîne pour avoir le retour un seul membre correspondant à ce nom (assurez-vous de vérifier null).

Lisez ces pages pour plus d'informations sur les méthodes de réflexion d'utilisation dans cette situation:

GetProperty

GetProperties

GetField

GetField

0

Eh bien, je pense que ce que vous cherchez pour est Reflection.

Vous pouvez voir ici un bon exemple: http://www.switchonthecode.com/tutorials/csharp-tutorial-using-reflection-to-get-object-information

Comme dit précédemment - les objets ne sont pas les noms mais vous pouvez parcourir les objets et obtenir leur type et agir en conséquence.

Ce blog here montre un très bon exemple de déplacement et d'utilisation de la réflexion.

Cela devrait être un bon début à coup sûr. Profitez-en!

+0

Vous ne pouvez pas parcourir 'tous les objets'. –

+0

@Hank, pourquoi pas? voir mon édition. –

+0

yN2, l'OQ veut rechercher tous les objets «chargés» (je pense). C'est plus proche de la Garbage Collection que de Reflection. –

Questions connexes