加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

.NET,C#,Reflection:列出字段的字段,字段本身具有字段

发布时间:2020-12-15 19:30:52 所属栏目:百科 来源:网络整理
导读:在.NET C#,假设ClassB有一个ClassA类型的字段. 可以使用方法GetFields轻松列出ClassB的字段. 但是,我还想列出那些本身有字段的ClassB字段的字段. 例如,ClassB的字段x具有字段b,s和i.我想(以编程方式)列出这些字段(正如我在以下代码中的评论所建议的那样). cl
在.NET& C#,假设ClassB有一个ClassA类型的字段.
可以使用方法GetFields轻松列出ClassB的字段.
但是,我还想列出那些本身有字段的ClassB字段的字段.
例如,ClassB的字段x具有字段b,s和i.我想(以编程方式)列出这些字段(正如我在以下代码中的评论所建议的那样).

class ClassA
    {
    public  byte    b ;
    public  short   s ;
    public  int i ;
    }

class ClassB
    {
    public  long    l ;
    public  ClassA  x ;
    }

class MainClass
    {
    public static void Main ( )
        {
        ClassA myAObject = new ClassA () ;
        ClassB myBObject = new ClassB () ;

        //  My goal is this:
        //    ***Using myBObject only***,print its fields,and the fields
        //    of those fields that,*themselves*,have fields.
        //  The output should look like this:
        //    Int64   l
        //    ClassA  x
        //               Byte   b
        //               Int16  s
        //               Int32  i

        }
    }

解决方法

使用FieldInfo.FieldType来反映类中字段的类型.例如.

fieldInfo.FieldType.GetFields();

以下是基于您的代码的完整示例,如果您在ClassA中有ClassZ,则使用递归.如果你有一个循环对象图,它会中断.

using System;
using System.Reflection;

class ClassA {
  public byte b;
  public short s; 
  public int i;
}

class ClassB {
  public long l;
  public ClassA x;
}

class MainClass {

  public static void Main() {
    ClassB myBObject = new ClassB();
    WriteFields(myBObject.GetType(),0);
  }

  static void WriteFields(Type type,Int32 indent) {
    foreach (FieldInfo fieldInfo in type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) {
      Console.WriteLine("{0}{1}t{2}",new String('t',indent),fieldInfo.FieldType.Name,fieldInfo.Name);
      if (fieldInfo.FieldType.IsClass)
        WriteFields(fieldInfo.FieldType,indent + 1);
    }
  }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读