【问题标题】:How to print all object fields dynamicly even if on of the fields is object即使其中一个字段是对象,如何动态打印所有对象字段
【发布时间】:2012-05-03 13:00:42
【问题描述】:

我想打印对象中的所有字段,如果其中一个字段是对象,我想打印它的字段,然后继续(使用递归)。

我写了函数,但是一旦我进入递归,我就会得到这个错误。

在类型“ConsoleApplication1.StringTest”上定义的字段“_str1”不是 目标对象上的字段类型 '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";
      }
}

【问题讨论】:

标签: c#-4.0


【解决方案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);
                }

            }
        }

【讨论】:

    【解决方案2】:

    您可以使用以下几行来编写对象公共字段。我在 .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) );
       }                        
    

    【讨论】:

      猜你喜欢
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2019-02-06
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多