如何递归打印对象的值';s使用反射的属性

本文关键字:属性 反射的 何递归 递归 对象 打印 | 更新日期: 2023-09-27 17:58:02

为了帮助调试我正在处理的一些代码,我开始编写一个方法来递归地打印对象属性的名称和值。然而,大多数对象都包含嵌套类型,我也想打印它们的名称和值,但只打印在我定义的类型上。

以下是我目前所拥有的一个概要:

public void PrintProperties(object obj)
{
    if (obj == null)
        return;
    Propertyinfo[] properties = obj.GetType().GetProperties();
    foreach (PropertyInfo property in properties)
    {
        if ([property is a type I have defined])
        {
            PrintProperties([instance of property's type]);
        }
        else
        {
            Console.WriteLine("{0}: {1}", property.Name, property.GetValue(obj, null));
        }
    }

牙套之间的部分我不确定。

任何帮助都将不胜感激。

如何递归打印对象的值';s使用反射的属性

下面的代码对此进行了尝试。对于"我定义的类型",我选择将类型与正在打印其属性的类型查看在同一程序集中,但如果在多个程序集中定义了类型,则需要更新逻辑。

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 && !property.PropertyType.IsEnum)
        {
            Console.WriteLine("{0}{1}:", indentString, property.Name);
            PrintProperties(propValue, indent + 2);
        }
        else
        {
            Console.WriteLine("{0}{1}: {2}", indentString, property.Name, propValue);
        }
    }
}

您想要使用反射有什么特殊的原因吗?相反,您可以像这样使用JavaScriptSerializer:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
string json = serializer.Serialize(obj);
Console.WriteLine(json);

它将递归地包含字符串中的所有属性,并在出现循环引用的情况下抛出异常。

利用Leonid的回答,下面的代码是我用来创建任何对象的可读Json转储的代码。它忽略null字段并添加缩进以获得更好的视图(尤其适用于SOAP对象)。

public static string SerializeToLogJson(this object obj)
        {
            try
            {
                var json = JsonConvert.SerializeObject(obj,
                    Newtonsoft.Json.Formatting.None, 
                    new JsonSerializerSettings { 
                        NullValueHandling = NullValueHandling.Ignore,
                        Formatting = Formatting.Indented
                    });
                return json;
            }
            catch (Exception e)
            {
                log.ErrorFormat(e.Message, e);
                return "Cannot serialize: " + e.Message;
            }
        }

Newtonsoft库提供了非常简单的函数,可以将任何对象序列化为JSON。这是一个简单得多的解决方案。

Newtonsoft.Json.JsonConvert.SerializeObject(objToSerialize);

例如:

dynamic obj = new { x = 1, y = 2, z = "abc" };
string json = JsonConvert.SerializeObject(obj);
//'json' string value: {"x":1,"y":2,"z":"abc"}