打印对象的列表<>财产价值C#

时间:2013-06-14 06:35:33

标签: c# list reflection properties dump

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

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

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

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

尝试过的解决方案:

How to recursively print the values of an object's properties using reflection

Recursively Get Properties & Child Properties Of An Object

Finding all properties and subproperties of an object

还有几个..

编辑:

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

,则会出现此问题

我尝试了以下内容:

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);
   }
}

给我输出结果:

  

CheckStatus:执行

     

TextData:System.Collections.Generic.List`1 [TextDataField]

     

容量:16

     

数:15

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

2)

RichTextBox.Text = dataSource.DumpToString(); 

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

提供相同的输出。

4 个答案:

答案 0 :(得分:1)

如果您不知道对象的类型及其属性,请为类(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);
    }
}

答案 1 :(得分:1)

当您控制要查看的类的源时,

“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)
        });
    }
}

答案 2 :(得分:-1)

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

var serializer = new JavaScriptSerializer();
string dump = serializer.Serialize(yourObjectInstance);

答案 3 :(得分:-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;