2010-11-28 33 views
3

J'ai une classe qui a BEAUCOUP de variables publiques et je dois pouvoir en obtenir une liste.Comment obtenir une liste de toutes les variables publiques que j'ai dans une classe? (C#)

Voici un exemple de ma classe:

public class FeatList: MonoBehaviour { 
public static Feat Acrobatic = new Feat("Acrobatic", false, ""); 
public static Feat AgileManeuvers = new Feat("Agile Maneuvers", false, ""); void Start(){}} 

Sauf il y a environ 100 plusieurs variables. Est-il possible d'obtenir toutes ces variables membres dans un tableau gérable? Ou est-ce que je me suis vissé?

Répondre

0

Cette volonté retourne un tableau FieldInfo de tous les champs publics de type Feat:

var fields = typeof(Feat).GetFields(); 

Ensuite, vous pouvez lire/écrire des champs comme ceci:

var field1 = fields[0]; 
var field1value = field1.GetValue(Acrobatic); 

Evidement,, GetValue renvoie objet typées, Vous devez donc le convertir au bon type à la demande.

+0

Vous devez spécifier un 'BindingFlag'. –

+0

Non, je ne le fais pas. Par défaut, les champs statiques, publics et d'instance sont inclus. –

1

Si par « Variables » signifient les champs de classe (comme variables au niveau de la classe), vous pouvez utiliser réflexion pour avoir accès, comme dans cet exemple MSDN Microsoft en utilisant la FieldInfo class (see MSDN link for more info)

using System; 
using System.Reflection; 

public class FieldInfoClass 
{ 
    public int myField1 = 0; 
    protected string myField2 = null; 
    public static void Main() 
    { 
     FieldInfo[] myFieldInfo; 
     Type myType = typeof(FieldInfoClass); 
     // Get the type and fields of FieldInfoClass. 
     myFieldInfo = myType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance 
      | BindingFlags.Public); 
     Console.WriteLine("\nThe fields of " + 
      "FieldInfoClass are \n"); 
     // Display the field information of FieldInfoClass. 
     for(int i = 0; i < myFieldInfo.Length; i++) 
     { 
      Console.WriteLine("\nName   : {0}", myFieldInfo[i].Name); 
      Console.WriteLine("Declaring Type : {0}", myFieldInfo[i].DeclaringType); 
      Console.WriteLine("IsPublic  : {0}", myFieldInfo[i].IsPublic); 
      Console.WriteLine("MemberType  : {0}", myFieldInfo[i].MemberType); 
      Console.WriteLine("FieldType  : {0}", myFieldInfo[i].FieldType); 
      Console.WriteLine("IsFamily  : {0}", myFieldInfo[i].IsFamily); 
     } 
    } 
} 

Au lieu de demander le FieldInfoClass dans cet exemple de la méthode Main, vous pouvez choisir votre classe FeatList. La logique n'a pas besoin d'être dans une méthode principale de la même classe. Vous pouvez placer votre version de la logique externe à l'entité que vous souhaitez interroger et en fait interroger n'importe quel objet ou classe avec ce type de logique.

Peu importe si les champs sont privés ou publics ou quelque chose d'autre - grâce à la réflexion, vous pouvez avoir accès à tous.

Voir l'exemple de code MSDN à FieldInfo.GetValue(..) method (MSDN link) pour savoir comment extraire la valeur du champ en utilisant la réflexion.

+0

Puis-je utiliser les variables? Je dois appeler des méthodes sur eux. Comme, if (FeatExample.boolThing) {// Code} – UnityPrgmer

+0

J'ai mis à jour la réponse en ajoutant un lien vers le bas qui montre comment obtenir une valeur de champ - une fois que vous avez la valeur, vous pouvez faire quelque chose avec comme ses méthodes. –

1

si vous êtes après les varaible NOMS - alors cela leur donnera à vous:

IEnumerable<string> variableNames = 
    typeof(FeatList).GetFields(BindingFlags.Instance | 
      BindingFlags.Static | BindingFlags.Public) 
     .Select(f => f.Name); 

mais si vous voulez que les VALEURS, cela fonctionnera:

Dictionary<string,object> variableValues = 
    typeof (FeatList).GetFields(BindingFlags.Instance | 
      BindingFlags.Static | BindingFlags.Public) 
     .ToDictionary(f => f.Name, f => f.GetValue(myFeatList)); 
+0

Je l'aurais upvoted 3 fois si j'avais pu, ça m'a fait gagner tellement de temps! – TheMoot