1

我有一个对象类型,例如:

Class
{
  public string Variable {get; set;}
  public List<AnotherClass> ListVariable {get; set;}
}

AnotherClass
{
  public string Variable {get; set;}
  public int IntVariable {get; set;}
}

我尝试了几种解决方案(ObjectDumper, object.GetProperties)来将所有对象值打印Class到屏幕上;问题以无法打印结束List<AnotherClass>。而不是所有的项目,我只得到它的计数属性。

尝试过的解决方案:

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

递归获取对象的属性和子属性

查找对象的所有属性和子属性

还有几个..

编辑:

好的,正如我所看到的,我可能没有很好地描述这个问题。当我不知道对象的类型及其属性时,我需要打印所有对象的属性及其值。如果对象仅包含简单属性,则列出的解决方案可以正常工作。如果其中一个属性是 List<>,则会出现问题

我尝试了以下方法:

1)

private static void PrintObject(Object dataSource)
{
   foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(dataSource))
   {
      string name = descriptor.Name;
      object value = descriptor.GetValue(dataSource);

      RichTextBox.Text += name + ": " + value + "\n";

      PrintObject(control, value);
   }
}

给我输出:

检查状态:已执行

文本数据:System.Collections.Generic.List`1[TextDataField]

容量:16

计数:15

但我在这里期待所有 15 个项目值,而不仅仅是列表计数。

2)

RichTextBox.Text = dataSource.DumpToString(); 

来自http://objectdumper.codeplex.com/

提供几乎相同的输出。

4

4 回答 4

0

如果你不知道对象的类型和属性,给类(AnotherClass)他自己的打印方法:

public Class
{
    public string variable;
    public List<AnotherClass> listVariable;

    public void Print()
    {
        foreach(var item in listVariable)
        {
           // ...or how you what to print?
           Console.WriteLine(item.GetString());
        }
    }
}

public AnotherClass
{
    public string variable;
    public int intVariable;

    public string GetString()
    {
        // Format here your output.
        return String.Format("Var: {0}, IntVar: {1}", this.variable, this.intVariable);
    }
}
于 2013-06-14T06:48:09.150 回答
0

当您控制要查看的类的源时,“dumper”方法是最简单和最正确的方法。这也是最安全的方法,因为您可以转储非public内容,同时防止外人直接访问。

实现这一点的最简单方法是覆盖提供给任何类型的ToString()方法。Object这样,您的代码将干净且可读。

您也可以通过它来完成它,System.Reflection但它会更复杂并且不会提供额外的好处。KISS 是这里的关键词。

像这样(在 LINQPad 中测试): 注意 public的东西应该大写,像这样:public int Variable

void Main()
{
    Class myClassObj = new Class();
    myClassObj.Variable = 1;
    myClassObj.ListVariable = new List<AnotherClass>();
    myClassObj.ListVariable.Add(new AnotherClass{ Variable="some", IntVariable=2 });

    Console.WriteLine(myClassObj.ToString());
}

public class Class
{
    public int Variable{get;set;}
    public List<AnotherClass> ListVariable {get;set;}

    public override string ToString()
    {
        return string.Join(", ", new string[]{ 
            string.Format("Variable= {0}", + this.Variable),
            string.Format("ListVariable= [{0}]", string.Join(", ", this.ListVariable))
        });
    }
}

public class AnotherClass
{
    public string Variable{get;set;}
    public int IntVariable{get;set;}

    public override string ToString()
    {
        return string.Join(", ", new string[]{
            string.Format("Variable={0}", this.Variable),
            string.Format("IntVariable={0}", this.IntVariable)
        });
    }
}
于 2013-06-14T07:10:32.060 回答
-1

JavaScriptSerializer您可以使用该类将其序列化为 JSON :

var serializer = new JavaScriptSerializer();
string dump = serializer.Serialize(yourObjectInstance);
于 2013-06-14T06:38:21.197 回答
-1

我想这可能会对你有所帮助。

Class A
    {
      public string variable;
      public List<B> listVariable;
    }

Class B
    {
      public string variable;
      public int intVariable;
    }

A obj = new A();  
//obj.listVariable[index].variable;
//obj.listVariable[index].intVariable;
于 2013-06-14T06:45:39.293 回答