7
votes

État de journalisation de l'objet. Obtenir toutes ses valeurs de propriété en tant que chaîne

/// <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();
}

2 commentaires

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.


3 Réponses :


5
votes
static void Log(object @object)
{
    foreach (var property in @object.GetType().GetProperties())
        Console.WriteLine(property.Name + ": " + property.GetValue(@object, null).ToString());
}

3 commentaires

L'appel ostring causerait un NullReferenceException 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



1
votes

Vous pouvez accéder au nom de la propriété à l'aide de la réflexion comme suit xxx


0 commentaires

24
votes
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();
}

5 commentaires

Argument Type 'Object' n'est pas assignable au type de paramètre 'String' Erreur de compilation sur Builder.append (propriété.name) .append ("=") .appendline (propriété.value); Déclaration


Pouvez-vous s'il vous plaît aidez-moi à comprendre qu'est-ce que .geproperties (BindingFlags.Public | BindingFlags.Instance) moyenne?


@ IMMAIL: J'ai mis à jour mon code pour supprimer cette erreur. Je n'ai jamais remarqué que appendline n'a pas le même ensemble de surcharges que Ajoutez .


@ 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.