循环遍历一组对象c#
本文关键字:一组 对象 遍历 循环 | 更新日期: 2023-09-27 18:20:06
我将一个对象作为参数传递给函数,该对象包含类型为FeatureItemInfo
的对象列表。
FeatureItemInfo
是一个具有以下属性的类:
Name, Value , Type , DisplayOrder, Column
我想循环浏览列表并显示每个<FeatureItemInfo>
对象的属性。
以下是到目前为止我能想到的。但是我无法获取featureIteminfo的值。
这是我的功能:
public static TagBuilder BuildHtml(StringBuilder output, object model)
{
if (model != null)
{
foreach (var indexedItem in model.GetType().GetProperties().Select((p, i) => new { item = p, Index = i }))
{
var Colval = (int)indexedItem.item.GetType().GetProperty("Column").GetValue(indexedItem.item, null);
......
}
}
}
应该是:
(int)indexedItem.item.GetValue(model, null);
您的item
属性是PropertyInfo
对象。您在它上调用GetValue()
,传递类的一个实例,以获取该属性的值。
indexedItem.item.GetType().GetProperty("Column")
上面的代码将在PropertyInfo
对象上查找属性"Column"(提示:PropertyInfo
没有"Column"属性)。
更新:根据您下面的评论,model
实际上是一个对象集合。如果是这样的话,你可能应该在你的函数签名中更明确一点:
public static TagBuilder BuildHtml( StringBuilder output, IEnumerable model )
现在,让我们来看看你的循环:
foreach (var indexedItem in model.GetType().GetProperties().Select((p, i) => new { item = p, Index = i }))
这实际上在做什么:
IEnumerable<PropertyInfo> l_properties = model.GetType().GetProperties();
var l_customObjects = l_properties.Select(
(p, i) =>
new {
item = p, /* This is the PropertyInfo object */
Index = i /* This is the index of the PropertyInfo
object within l_properties */
}
)
foreach ( var indexedItem in l_customObjects )
{
// ...
}
这是从模型对象中获取一个属性列表,然后迭代这些属性(或者,更确切地说,是包装这些属性的匿名对象)。
我认为你真正想要的是更像这样的东西:
// This will iterate over the objects within your model
foreach( object l_item in model )
{
// This will discover the properties for each item in your model:
var l_itemProperties = l_item.GetType().GetProperties();
foreach ( PropertyInfo l_itemProperty in l_itemProperties )
{
var l_propertyName = l_itemProperty.Name;
var l_propertyValue = l_itemProperty.GetValue( l_item, null );
}
// ...OR...
// This will get a specific property value for the current item:
var l_columnValue = ((dynamic) l_item).Column;
// ... of course, this will fail at run-time if your item does not
// have a Column property, unlike the foreach loop above which will
// simply process all properties, whatever their names
}
考虑的另一种方法是使用dynamic
,它只需在没有反射的情况下直接获得属性:
public static TagBuilder BuildHtml(StringBuilder output, object model)
{
if (model != null)
{
var Colval = ((dynamic)model).Column;
}
}