/// <summary> /// Creates a string of all property value pair in the provided object instance /// </summary> /// <param name="objectToGetStateOf"></param> /// <exception cref="ArgumentException"></exception> /// <returns></returns> public static string GetLogFor(object objectToGetStateOf) { if (objectToGetStateOf == null) { const string PARAMETER_NAME = "objectToGetStateOf"; throw new ArgumentException(string.Format("Parameter {0} cannot be null", PARAMETER_NAME), PARAMETER_NAME); } var builder = new StringBuilder(); foreach (var property in objectToGetStateOf.GetType().GetProperties()) { object value = property.GetValue(objectToGetStateOf, null); builder.Append(property.Name) .Append(" = ") .Append((value ?? "null")) .AppendLine(); } return builder.ToString(); }
3 Réponses :
static void Log(object @object) { foreach (var property in @object.GetType().GetProperties()) Console.WriteLine(property.Name + ": " + property.GetValue(@object, null).ToString()); }
L'appel code> ostring code> causerait un NullReferenceException code> pour une valeur de propriété null.
J'ai dû mettre un chèque nul avant d'accéder à la valeur de la propriété.
Je préfère ce répondeur car il n'utilise pas Linq
Vous pouvez accéder au nom de la propriété à l'aide de la réflexion
comme suit
public static string GetLogFor(object target) { var properties = from property in target.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance) select new { Name = property.Name, Value = property.GetValue(target, null) }; var builder = new StringBuilder(); foreach(var property in properties) { builder .Append(property.Name) .Append(" = ") .Append(property.Value) .AppendLine(); } return builder.ToString(); }
Argument Type 'Object' n'est pas assignable au type de paramètre 'String' code> Erreur de compilation sur
Builder.append (propriété.name) .append ("=") .appendline (propriété.value); code> Déclaration
Pouvez-vous s'il vous plaît aidez-moi à comprendre qu'est-ce que .geproperties (BindingFlags.Public | BindingFlags.Instance) code> moyenne?
@ IMMAIL: J'ai mis à jour mon code pour supprimer cette erreur. Je n'ai jamais remarqué que appendline code> n'a pas le même ensemble de surcharges que
Ajoutez code>.
@ IMMAIL: Cette ligne de code signifie "Obtenez toutes les propriétés publiques et définies par exemple (par opposition à la statique)".
@Bryan! Merci à un million de tonnes de partager ce peu d'informations avec moi.
Y avait-il des raisons de ne pas utiliser la sérialisation?
Je le voulais au format lisible humain de sorte que chaque fois que je devais voir à travers les journaux, je peux rapidement voir quelles étaient les valeurs de n'importe quelle propriété de l'objet au moment de l'erreur.