美文网首页Unity基础入门分享c#反射入门
c#反射入门篇(Reflection)——FieldInfo 获

c#反射入门篇(Reflection)——FieldInfo 获

作者: 懒_开果 | 来源:发表于2019-05-28 19:10 被阅读124次

    也算记录自己的学习篇=。= 适合入门看 这里简单介绍下FieldInfo 和他常用的几个方法

    简介

    FieldInfo就是通过反射指定类获取到的 该类里面字段的属性并提供对字段元数据的访问权限。

    1.如何获取?

    Type.GetField(String) 获取该类的指定的名字String公开的字段 如果私有会为空
    Type.GetField(String,BindingFlags) 获取该类的指定的名字String,和指定类型BindingFlags的字段
    Type.GetFields() 获取该类的所有公开的字段
    Type.GetFields(BindingFlags) 获取该类的所有指定类型BindingFlags的字段

    例子

    先定义个类型

      public class Field
       {
          public int A;
          public string B;
    
          private int C;
          private string D;
      }
    
    Type.GetField(String)
             FieldInfo feldInfo1 = typeof(Field).GetField("A");
            FieldInfo feldInfo2 = typeof(Field).GetField("C");/,
    
            Console.WriteLine(feldInfo1.Name);
            Console.WriteLine(feldInfo2.Name);
            Console.ReadKey();
    
    image.png

    可以看出来第二个C是私有的所以会为空

    Type.GetField(String,BindingFlags)
             FieldInfo feldInfo1 = typeof(Field).GetField("A");
            FieldInfo feldInfo2 = typeof(Field).GetField("C",BindingFlags.NonPublic|BindingFlags.Instance);//BindingFlags.Instance(对象) 和 BindingFlags.Static(静态) 必须有一个,
    
            Console.WriteLine(feldInfo1.Name);
            Console.WriteLine(feldInfo2.Name);
            Console.ReadKey();
    

    结果: image.png

    用上了 BindingFlags之后就可以获取到指定的类型 但是有一点必须的是BindingFlags.Instance(对象) 和 BindingFlags.Static(静态) 必须有一个,

    Type.GetFields()
    Type.GetFields(BindingFlags)
           FieldInfo[] feldInfos1 = typeof(Field).GetFields();
            FieldInfo[] feldInfos2 = typeof(Field).GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
    
            foreach (FieldInfo item in feldInfos1)
            {
                Console.WriteLine("不加BindingFlags:" + item.Name);
            }
            foreach (FieldInfo item in feldInfos2)
            {
                Console.WriteLine("加BindingFlags:" + item.Name);
            }
    
            Console.ReadKey();
    

    结果:

    2.常用属性

    这里就列几个常用的=。=完全的可以自己 去看c#的API

    属性 作用
    Attributes 获取与此字段关联的特性(\color{red}{就是获取字段私有化 公开的,静态那些特性})
    Custom 获取包含此成员自定义属性的集合。
    DeclaringType 获取是谁声明该模块成员的类的Type
    FieldType 获取这个字段对象的Type
    ReflectedType 获取 MemberInfo 的此实例的类对象(\color{red}{大概就是获取这个字段的Type})
    还有一堆is开头的bool属性 都是字面意思 就是判断是否含有

    3.方法 =。=我就写下基础的几个

    • 先声明一个类

      public class Field
            {
             public int A;
             public string B;
            public Action action;
            private int C;
            private string D;
            }
    
    • 赋值 SetValue(Object, Object)

      • SetValue(含有这个字段的类的对象,要赋的值)

         Action action=()=> { };
         Field field = new Field();
        Console.WriteLine(field.action ==null ? "空的" : "不为空" );
         FieldInfo fieldaction = field.GetType().GetField("action");
         fieldaction.SetValue(field,action);
         Console.WriteLine(field.action == null ? "空的" : "不为空");
         Console.ReadKey();
        
      • 结果 image.png
    • 获取值 GetValue(Object)

      • GetValue(含有这个字段的类的对象)
            Field field = new Field();
              Console.WriteLine(field.A);
              field.A += 10;
              Console.WriteLine(field.GetType().GetField("A").GetValue(field));
              Console.ReadKey();
      
      • 结果: image.png

    好了 差不多结束了=。= 不定期更新下篇

    u3d萌新QQ群844087555 欢迎进来灌水=。=

    相关文章

      网友评论

        本文标题:c#反射入门篇(Reflection)——FieldInfo 获

        本文链接:https://www.haomeiwen.com/subject/xocktctx.html