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";
Рассмотрим выше класс и позже его инициализацию. Теперь в какой-то момент я хочу записать его состояние при возникновении ошибки. Я хотел бы получить строку журнала примерно так, как показано ниже.
string toLog = Helper.GetLogFor(emp1Address);
sting toLog должен выглядеть примерно так, как показано ниже.
AddressLine1 = "Microsoft Corporation";
AddressLine2 = "One Microsoft Way";
City = "Redmond";
State = "WA";
Zip = "98052-6399";
А затем я буду записывать toLog
строку.
Как я могу получить доступ ко всему свойству имена и значения свойств объекта в методе Helper.GetLogFor ()
?
Решение, которое я реализовал: -
/// <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();
}
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();
}
Вы можете получить доступ к имени свойства с помощью отражения. как следующий
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.
}
static void Log(object @object)
{
foreach (var property in @object.GetType().GetProperties())
Console.WriteLine(property.Name + ": " + property.GetValue(@object, null).ToString());
}