9
votes

Comment itérez toutes les propriétés d'un objet en C #?

Je suis nouveau à C #, je veux écrire une fonction pour itérer les propriétés d'un objet et définir toutes les chaînes NULL à "". J'ai entendu dire qu'il est possible d'utiliser quelque chose appelé "réflexion" mais je ne sais pas comment.

merci


5 commentaires

Cela ressemble à une chose assez étrange à faire. Je suis curieux de savoir ce que vous essayez d'y parvenir?


Sur une note latérale, vous voudrez peut-être envisager de définir vos chaînes NULL à "String.empty" au lieu de "". L'impact réel mondial est négligeable, mais pour des raisons de code efficace, le premier ne crée pas un nouvel objet.


En outre, je suis d'accord avec Andynormancx ... Quel est votre objectif ici?


Dans ma candidature, il existe de nombreux objets de types différents avec un grand nombre de champs qui doivent être initialisés, il faut tellement de temps pour initialiser les champs un par un.


Pourquoi avez-vous besoin alors initialisé pour vider les cordes plutôt que null?


3 Réponses :


1
votes
foreach(PropertyInfo pi in myobject.GetType().GetProperties(BindingFlags.Public))
{
    if (pi.GetValue(myobject)==null)
    {
        // do something
    }
}

0 commentaires

1
votes
object myObject;

PropertyInfo[] properties = myObject.GetType().GetProperties(BindingFlags.Instance);
See http://msdn.microsoft.com/en-us/library/aa332493(VS.71).aspx

0 commentaires

21
votes
public class Foo
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
    public int Prop3 { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var foo = new Foo();

        // Use reflection to get all string properties 
        // that have getters and setters
        var properties = from p in typeof(Foo).GetProperties()
                         where p.PropertyType == typeof(string) &&
                               p.CanRead &&
                               p.CanWrite
                         select p;

        foreach (var property in properties)
        {
            var value = (string)property.GetValue(foo, null);
            if (value == null)
            {
                property.SetValue(foo, string.Empty, null);
            }
        }

        // at this stage foo should no longer have null string properties
    }
}

3 commentaires

Oui, la vérification de la lecture / écriture est importante avant de lire / écrire.


Je pense que vous avez oublié d'ajouter un BindingFlag lorsque vous obtenez des propriétés via une réflexion?


@Danny, l'OP n'a rien spécifié de la visibilité des propriétés dont il parle. Si vous omettez ces drapeaux, il ne cherchera que les propriétés publiques qui semblent assez raisonnables.