2009-04-15 6 views
1

J'ai un objet .Net (en C#) qui a des propriétés nommées event1, event2 et ainsi de suite.Accès à des propriétés nommées similaires dans une boucle

Je dois faire un peu d'if-else sur chacun d'entre eux. est-ce que je peux boucler ces derniers. Si c'étaient des contrôles j'aurais pu utiliser la collection de contrôles, mais ce sont les propriétés d'un objet.

Une aide?

Répondre

2

En supposant que vous savez combien de propriétés que vous avez affaire à

for(int eventIndex = 0; eventIndex < NUM_EVENTS; eventIndex++) 
    { 
     PropertyInfo eventPropertyInfo = 
      this.GetType().GetProperty("Event" + eventIndex); 

     if (eventPropertyInfo.GetValue(this, null) == yourValue) 
     { 
      //Do Something here 
     } 
    } 
2

Il est probablement plus clair de l'écrire manuellement. Cependant, il est possible de faire en utilisant la réflexion.

0

Oui, vous pouvez utiliser Reflection pour obtenir les objets PropertyInfo, interroger les noms et obtenir les données dont vous avez besoin.

2

L'utilisation de reflection est votre meilleure option, mais elle peut être trop coûteuse pour ce dont vous avez besoin. L'extrait ci-dessous est tirée de msdn:

  foreach (MemberInfo mi in t.GetMembers()) 
      {         

       // If the member is a property, display information about the 
       // property's accessor methods. 
       if (mi.MemberType==MemberTypes.Property) 
       { 
        PropertyInfo pmi = ((PropertyInfo) mi); 
        foreach (MethodInfo am in pmi.GetAccessors()) 
        { 
         Display(indent+1, "Accessor method: {0}", am); 
        } 
       } 
      } 
1

Quelle est votre raisonnement pour le faire? Est-ce pour accélérer le développement? Vous pouvez utiliser la réflexion comme beaucoup l'ont déjà suggéré, mais il serait beaucoup plus efficace de simplement référencer les propriétés directement au lieu de prendre la pénalité de performance à l'exécution.

0

La réflexion est une solution simple mais elle peut être lente en fonction de l'utilisation de votre application. Si la réflexion est lente, vous pouvez accélérer le code Emiting. Ce n'est pas la chose la plus facile à faire, mais le résultat final est le même que si vous écriviez chaque ligne manuellement. Il est également difficile de maintenir un tel code.

Questions connexes