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