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. P>
merci p>
3 Réponses :
foreach(PropertyInfo pi in myobject.GetType().GetProperties(BindingFlags.Public)) { if (pi.GetValue(myobject)==null) { // do something } }
object myObject; PropertyInfo[] properties = myObject.GetType().GetProperties(BindingFlags.Instance); See http://msdn.microsoft.com/en-us/library/aa332493(VS.71).aspx
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 } }
Oui, la vérification de la lecture / écriture est importante avant de lire / écrire.
Je pense que vous avez oublié d'ajouter un BindingFlag code> 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.
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?