我有一个对象类型,例如:
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>
。而不是所有的项目,我只得到它的计数属性。
尝试过的解决方案:
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/
提供相同的输出。
答案 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;