2012-05-03 6 views
1

オブジェクトのすべてのフィールドを印刷したいと思います。フィールドの1つがオブジェクトであれば、フィールドを印刷したいと思います。 。フィールドのオンがオブジェクトであっても、すべてのオブジェクトフィールドを動的に印刷する方法

私は関数を書きましたが、再帰に入るとこのエラーが発生します。タイプ定義

フィールド '_str1「ConsoleApplication1.StringTest」はタイプ である対象オブジェクトのフィールド ない「System.Reflection.RtFieldInfo」。

これはコードです:

static void OutPutObject(dynamic dyn,Type pType) 
     { 
      List<string> lFieldsList = new List<string>(); 

      // Get the type of MyClass. 
      Type lType = pType; 

      // Get the FieldInfo of MyClass. 
      FieldInfo[] myFields = lType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 
      // Display the values of the fields. 
      for (int i = 0; i < myFields.Length; i++) 
      { 
       if (myFields[i].FieldType.IsClass && myFields[i].FieldType.Name != "String") 
       { 
        Type tType = myFields[i].FieldType.GetType(); 
        OutPutObject(myFields[i], pType); 
       } 
       else 
       { 
        Console.WriteLine(string.Format("{0}: {1}", myFields[i].Name, myFields[i].GetValue(dyn))); 
       } 

      } 
     } 




public class IntTest 
{ 
     private int a = 1; 
     private int b = 2; 
} 

public class StringTest 
{ 
     private string _str1; 
     private string _str2; 
     private IntTest intl; 

     public StringTest() 
     { 
      _str1 = "str1"; 
      _str2 = "str2"; 
     } 
} 
+0

これを考慮してください:http://stackoverflow.com/questions/6309254/a-way-to-pretty-print-a-c-sharp-object – Malcolm

答えて

1

私はあなたのコードを変更して、今すぐ動作します! 内部クラスにはデフォルトコンストラクタが必要です。

static void OutPutObject(object obj, Type pType, bool isFirst) 
     { 

      // Get the FieldInfo of MyClass. 
      FieldInfo[] myFields = pType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); 
      // Display the values of the fields. 
      for (int i = 0; i < myFields.Length; i++) 
      { 
       if (myFields[i].FieldType.IsPrimitive || myFields[i].FieldType == typeof(Decimal) || myFields[i].FieldType == typeof(String)) 
       { 

        if (!isFirst) 
        { 
         object temp = Activator.CreateInstance(pType); 
         obj = temp; 
        } 
        Console.WriteLine(string.Format("{0}: {1}", myFields[i].Name, myFields[i].GetValue(obj))); 
       } 
       else if (myFields[i].FieldType.IsClass) 
       { 
        Type tType = myFields[i].FieldType; 
        OutPutObject(myFields[i], tType, false); 
       } 

      } 
     } 
0

あなたはpublicフィールドオブジェクトの書き込みに以下の行を使用することができます。私は.NET 4.0でテストしました

Type type = obj.GetType(); 

    foreach (var f in type.GetFields().Where(f => f.IsPublic)) { 
     Console.WriteLine("Name: "+f.Name+" Value: "+ f.GetValue(obj)); 
    }       
関連する問題