2011-11-30 46 views
0

オブジェクトのすべてのプロパティとプロパティ値を取得しようとしている次のコードがあります。いくつかのプロパティは、コレクションまたはコレクションのコレクションである可能性があるので、これらのタイプの再帰関数を設定しようとしました。残念ながらそれは、ワーキングこのライン再帰的エラーハンドラ

if (property.GetValue(item, null) is IEnumerable) 

にerroringと私が変更された必要があるか分からないではないです。誰でもここで助けることができますか?ありがとう。

public static string PackageError(IEnumerable<object> obj) 
{ 
    var sb = new StringBuilder(); 

    foreach (object o in obj) 
    { 
     sb.Append("<strong>Object Data - " + o.GetType().Name + "</strong>"); 
     sb.Append("<p>"); 

     PropertyInfo[] properties = o.GetType().GetProperties(); 
     foreach (PropertyInfo pi in properties) 
     { 
      if (pi.GetValue(o, null) is IEnumerable && !(pi.GetValue(o, null) is string)) 
       sb.Append(GetCollectionPropertyValues((IEnumerable)pi.GetValue(o, null))); 
      else 
       sb.Append(pi.Name + ": " + pi.GetValue(o, null) + "<br />"); 
     } 

     sb.Append("</p>"); 
    } 

    return sb.ToString(); 
} 

public static string GetCollectionPropertyValues(IEnumerable collectionProperty) 
{ 
    var sb = new StringBuilder(); 

    foreach (object item in collectionProperty) 
    { 
     PropertyInfo[] properties = item.GetType().GetProperties(); 
     foreach (var property in properties) 
     { 
      if (property.GetValue(item, null) is IEnumerable) 
       sb.Append(GetCollectionPropertyValues((IEnumerable)property.GetValue(item, null))); 
      else 
       sb.Append(property.Name + ": " + property.GetValue(item, null) + "<br />"); 
     } 
    } 

    return sb.ToString(); 
} 
+0

エラーと言うと、例外が発生していますか?エラーはどういう意味ですか? – Chris

+0

エラーメッセージに「Parameter count mismatch」と表示されます。 –

+0

オブジェクトのソースは何ですか?たとえば、Excelの場合、プロパティがインデックス付きのプロパティである可能性があります。その場合、nullをproperty.GetValue()に渡すことはできません。 – phoog

答えて

0

私はあなたがそれを汎用的にしようとしている場合は、この情報を提供するために、XMLシリアル化またはJSONのシリアライズとして、既存のシリアル化メカニズムを使用してお勧めします。

+0

はい、ずっと簡単です。ありがとう! –

0

特定のプロパティがインデクサーのように聞こえるので、インデックス値をGetValueメソッドに渡す必要があります。インデクサを使用してインデックスとして渡すのが有効な値を決定する簡単な方法はありません。一般的に、クラスはインデクサを自由に実装できます。たとえば、文字列にキーを付けたディクショナリには、キーごとのインデクサがあり、キーのプロパティで列挙されたインデックスを使用できます。

コレクションをシリアライズする典型的なアプローチは、個々のプリミティブコレクションタイプ(配列、リスト、ディクショナリなど)を個別に扱う特別なケースとして扱うことです。

ここでは、IEnumerableを返すプロパティとインデクサーの間に違いがあることに注意してください。