Вот расширение, которое будет сообщать о стандартных типах, таких как string, int и Datetime, но также будет сообщать о списках строк (показанных ниже в AccessPoints
, которые не удалось обработать вышеупомянутым ответом). Обратите внимание, что выходные данные выровнены, такие как:
Name : Omegaman
ID : 1
Role : Admin
AccessPoints : Alpha, Beta, Gamma
WeekDays : Mon, Tue
StartDate : 3/18/2014 12:16:07 PM
Ниже приведено расширение, которое принимает любой тип до тех пор, пока его класс. Затем он отражает общие и частные свойства и, если они не равны NULL, сообщает о них.
public static string ReportAllProperties<T>(this T instance) where T : class
{
if (instance == null)
return string.Empty;
var strListType = typeof(List<string>);
var strArrType = typeof(string[]);
var arrayTypes = new[] { strListType, strArrType };
var handledTypes = new[] { typeof(Int32), typeof(String), typeof(bool), typeof(DateTime), typeof(double), typeof(decimal), strListType, strArrType };
var validProperties = instance.GetType()
.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
.Where(prop => handledTypes.Contains(prop.PropertyType))
.Where(prop => prop.GetValue(instance, null) != null)
.ToList();
var format = string.Format("{{0,-{0}}} : {{1}}", validProperties.Max(prp => prp.Name.Length));
return string.Join(
Environment.NewLine,
validProperties.Select(prop => string.Format(format,
prop.Name,
(arrayTypes.Contains(prop.PropertyType) ? string.Join(", ", (IEnumerable<string>)prop.GetValue(instance, null))
: prop.GetValue(instance, null)))));
}
Использование
myInstance.ReportAllProperties()
Обратите внимание, что это основано на моей статье в блоге C #: ToString для сообщения обо всех свойствах, даже личных, с помощью отражения , которое обеспечивает более надежное объяснение происходящего.