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属性,那么您对该属性所做的更改将会不会被反映在根对象上。