2

オブジェクトをパラメータとして関数に渡していますが、そのオブジェクトには type のオブジェクトのリストが含まれています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);
......
         }

      }
    }
4

2 に答える 2

4

次のようにする必要があります。

 (int)indexedItem.item.GetValue(model, null);

あなたのitem財産はオブジェクトPropertyInfoです。それを呼び出しGetValue()て、クラスのインスタンスを渡し、そのプロパティの値を取得します。

indexedItem.item.GetType().GetProperty("Column")

上記のコードは、オブジェクトのプロパティ "Column" を探しPropertyInfoます (ヒント: 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
}
于 2013-06-27T16:57:27.087 に答える
2

考慮される別のアプローチはdynamic、リフレクションなしでプロパティを直接取得するだけです。

public static TagBuilder BuildHtml(StringBuilder  output, object model)
{
    if (model != null)
    {
        var Colval = ((dynamic)model).Column;
    }
}
于 2013-06-27T17:01:43.940 に答える