c#foreach(property in object)…有没有一个简单的方法来做到这一点?

我有一个包含多个属性的类(如果有任何区别,所有都是string)。
我也有一个列表,其中包含许多不同的类实例。

当为我的类创build一些unit testing时,我决定循环遍历列表中的每个对象,然后遍历该对象的每个属性。

我以为这样做会很简单

foreach (Object obj in theList) { foreach (Property theProperties in obj) { do some stufff!!; } } 

但是这没有工作! :(我得到这个错误…

“foreach语句不能对'Application.Object'types的variables进行操作,因为'Application.Object'不包含'GetEnumerator'的公共定义

有没有人知道这样做没有吨ifs和循环或没有进入任何太复杂的方式吗?

试试这个:

 foreach (PropertyInfo propertyInfo in obj.GetType().GetProperties()) { // do stuff here } 

还请注意Type.GetProperties()有一个重载接受一组绑定标志,所以你可以筛选出不同的标准,如可访问性级别的属性,请参阅MSDN的更多细节: Type.GetProperties方法(BindingFlags)最后但并非最不重要不要忘记添加“system.Reflection”程序集引用。

例如解决所有的公共属性:

 foreach (var propertyInfo in obj.GetType() .GetProperties( BindingFlags.Public | BindingFlags.Instance)) { // do stuff here } 

请让我知道这是否按预期工作。

你可以像这样遍历一个对象的所有非索引属性:

 var s = new MyObject(); foreach (var p in s.GetType().GetProperties().Where(p => !p.GetGetMethod().GetParameters().Any())) { Console.WriteLine(p.GetValue(s, null)); } 

由于GetProperties()返回索引器以及简单的属性,所以在调用GetValue之前,需要额外的filter来知道传递null作为第二个参数是安全的。

您可能需要进一步修改filter,以清除只写和其他不可访问的属性。

好没问题:

 foreach(object item in sequence) { if (item == null) continue; foreach(PropertyInfo property in item.GetType().GetProperties()) { // do something with the property } } 

你几乎在那里,你只需要从types获得属性,而不是期望的属性可以通过集合或属性包的forms访问:

 var property in obj.GetType().GetProperties() 

从那里你可以像这样访问 :

 property.Name property.GetValue(obj, null) 

使用GetValue ,第二个参数将允许您指定索引值,这将与返回集合的属性一起工作 – 由于string是一个字符集合,因此如果需要,还可以指定索引以返回字符。

使用reflection来做到这一点

 SomeClass A = SomeClass(...) PropertyInfo[] properties = A.GetType().GetProperties(); 

谨慎的一句话,如果“做一些事情”意味着更新您访问的实际属性的值,并且如果沿着从根对象到访问属性的path存在结构types属性,那么您对该属性所做的更改将会不会被反映在根对象上。