我正在尝试编写一个可以传递对象的通用函数,它将打印出c#中的所有属性和值。
我在那里尝试了很多例子,例如this,还有一些像
public void PrintProperties(object obj)
{
PrintProperties(obj, 0);
}
public void PrintProperties(object obj, int indent)
{
if (obj == null) return;
string indentString = new string(' ', indent);
Type objType = obj.GetType();
PropertyInfo[] properties = objType.GetProperties();
foreach (PropertyInfo property in properties)
{
object propValue = property.GetValue(obj, null);
if (property.PropertyType.Assembly == objType.Assembly)
{
Console.WriteLine("{0}{1}:", indentString, property.Name);
PrintProperties(propValue, indent + 2);
}
else
{
Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue);
}
}
}
和
foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(obj))
{
string name = descriptor.Name;
object value = descriptor.GetValue(obj);
Console.WriteLine("{0}={1}", name, value);
}
但我在调试/日志文件中想要的一些对象包含string []属性。所有这些示例都将这些输出为
System.String[]
如果我有像
这样的对象class Thing
{
public string Name { get; set; }
public int Number { get; set; }
public string[] Names { get; set; }
}
我希望在日志中看到如下所示的任何值
Name: Test
Number: 3
Names[0]: Fred
Names[1]: John
Names[2]: Jimmy
感谢您的帮助=]
这是我最终使用的课程
class Descriptor
{
public void PrintProperties(object obj)
{
PrintProperties(obj, 0);
}
public void PrintProperties(object obj, int indent)
{
if (obj == null) return;
string indentString = new string(' ', indent);
Type objType = obj.GetType();
PropertyInfo[] properties = objType.GetProperties();
foreach (PropertyInfo property in properties)
{
object propValue = property.GetValue(obj, null);
if (propValue.GetType().IsArray)
{
object[] arrary = (object[]) propValue;
foreach (string value in arrary)
{
if (property.PropertyType.Assembly == objType.Assembly)
{
Console.WriteLine("{0}{1}:", indentString, property.Name);
PrintProperties(value, indent + 2);
}
else
{
Console.WriteLine("{0}{1}: {2}", indentString, property.Name, value);
}
}
continue;
}
if (property.PropertyType.Assembly == objType.Assembly)
{
Console.WriteLine("{0}{1}:", indentString, property.Name);
PrintProperties(propValue, indent + 2);
}
else
{
Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue);
}
}
}
}
现在我将使用这个类的Log4Net,现在在我的mvc3网站上,我可以通过提供ViewModels来调用它,并在开启时进行全面的调试
答案 0 :(得分:4)
如果您不介意使用Windows窗体,那么一个名为PropertyGrid
的控件基本上可以执行您想要的操作:http://msdn.microsoft.com/en-us/library/system.windows.forms.propertygrid(v=vs.90).aspx
现在,针对您的具体问题,问题是您没有查看数组内部。你应该做的是看每个属性的类型。如果它是一个数组类型,那么您需要将值转换为object[]
数组,然后遍历每个元素,而不是简单地打印值ToString()
输出。您还需要创建一个递归算法,该算法查看每个属性,并将其视为具有要迭代的属性的对象。如果您需要帮助,请告诉我。