2010-08-10 7 views
6
public class Address 
{ 
    public string AddressLine1 { get; set; } 
    public string AddressLine2 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string Zip { get; set; } 
} 
...... 
var emp1Address = new Address(); 
emp1Address.AddressLine1 = "Microsoft Corporation"; 
emp1Address.AddressLine2 = "One Microsoft Way"; 
emp1Address.City = "Redmond"; 
emp1Address.State = "WA"; 
emp1Address.Zip = "98052-6399"; 

Considere la clase superior y luego su inicialización. Ahora en algún momento quiero registrar su estado cuando se produce un error. Me gustaría obtener el registro de cadenas de algún modo a continuación.Estado de registro del objeto. Obteniendo todos sus valores de propiedad como cadena

string toLog = Helper.GetLogFor(emp1Address); 

sting toLog debería tener el siguiente aspecto.

AddressLine1 = "Microsoft Corporation"; 
AddressLine2 = "One Microsoft Way"; 
City = "Redmond"; 
State = "WA"; 
Zip = "98052-6399"; 

Y entonces voy a entrar toLog cadena.

¿Cómo puedo acceder a todos los nombres de propiedades y valores de propiedad de un objeto dentro del método Helper.GetLogFor()?

solución que he implementado: -

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

¿Había alguna razón para no usar ¿publicación por entregas? –

+0

Lo quería en formato legible para que cada vez que tuviera que ver los registros, pudiera ver rápidamente cuáles eran los valores en cualquier propiedad del objeto en el momento del error. – IsmailS

Respuesta

18
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(); 
} 
+0

'Argumento típico 'objeto' no se puede asignar al tipo de parámetro 'cadena'' error de compilación en' builder.Append (property.Name) .Append ("=") .AppendLine (property.Value); 'statement – IsmailS

+0

¿Puede por favor ayudarme a entender qué significa' .GetProperties (BindingFlags.Public | BindingFlags.Instance) '? – IsmailS

+0

@Ismail: actualicé mi código para eliminar ese error. Nunca me di cuenta de que 'AppendLine' no tiene el mismo conjunto de sobrecargas que' Append'. –

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

La llamada 'ToString' causaría una' NullReferenceException' para un valor de propiedad nulo. –

+0

Tuve que poner un cheque nulo antes de acceder al valor de la propiedad. – IsmailS

+0

Prefiero este contestador porque no utiliza Linq – UpTheCreek

1

Se puede acceder al nombre de la propiedad utilizando la reflexión como seguir

Type t = emp1Address.GetType(); 


PropertyInfo [] pi = t.GetProperties(); 
    foreach (PropertyInfo p in pi) 
    { 

    //You can get the value (using GetValue() method) and name (p.Name) here. 



    } 
Cuestiones relacionadas