浏览器标题切换
浏览器标题切换end

Intern Day82 - C#反射Reflection相关基本知识

个人理解

今天下午花了三个小时大概学习了一下,我的理解就是,C#通过反射这个特性,可以帮助开发之直接访问到一个对象比如People的内部,可以查看其内部的方法啦、属性啦等。并且在对一个对象的多个(非常多的意思)进行赋值,不需要去new然后一个个=赋值过去了,减少代码量,不仅在一定程度上减少了开发者的工作量,也便于后期维护的人进行查看。

为什么需要反射

  1. 官方说明:是程序可以访问、检测、修改它本身状态或行为一种能力。

  2. 通过反射可以直接访问到对象的属性和方法

  3. 有时不知道具体的类型,可以通过dll去得到类的对象/如果不知道给到的dll里有哪些方法和属性,通过反射可以知道里面内容

    • dll:动态链接库文件,里面放的是各种函数、类、结构体这些。不能独立执行,但是可被调用。

    • 在C#里dll相当于一段可调用的代码 相当于 一个 *.cs的代码源文件

    • dll和一般cs的区别:只在于 *.cs的代码可以看到源码,dll看不到

  4. 某些特殊方法,传过来的是泛型类,需要通过反射处理某些特殊的业务

  5. 通用方法DataTable和List的相互转化时需要用到反射

  6. 对于属性执行的操作少可以手动增删改查,但是如果属性数量几十几百甚至更多的时候,从开发和维护角度来说是极其不便的,这时候就需要使用反射了。也就是说,某些情况下,反射优于new

  7. 要输出多种结构体的多个属性(Id、Name、Score等)的情况下

反射作用

  1. 允许在运行时查看特性(attribute)信息/查看元数据

  2. 允许审查集合中的各种类型,以及实例化这些类型

  3. 允许延迟绑定的方法和属性(property)

  4. 允许在运行时创建新类型,然后使用这些类型执行一些任务。

反射相关方法

// 要对某一对象进行系修改属性值,首先需要获取其类型,才能再去进行增删改查等操作
People people = new People();
Type type = People.GetType(); //获取类型
  
type.GetMembers();//得到对象的所有public成员
type.GetProperties(); //得到对象的所有public属性
type.GetFields(); //得到对象的所有public字段
type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance); //得到对象的私有成员
type.GetMembers(BindingFlags.Public|BindingFlags.Static); //得到对象的静态成员
……

反射的使用举例

using System;
using System.Diagnostics;
using System.Reflection;
using System.Security.Cryptography;

namespace Practice1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!"); 
            
            Type people = typeof(People);
            
            Console.WriteLine("class = " + people.Name); // class = People
            // Console.WriteLine("class = ",people.Name); 
            // 这个Name不是属性Name,是指class的名字
            
            Console.WriteLine("namespace = " + people.Namespace); // namespace = Practice1
            //Console.WriteLine("namespace = ",people.Namespace);
            
            // Console.ReadKey(); 
            
            //----------------------------------------------------
            
            PropertyInfo[] peopleInfos = people.GetProperties();
            // GetProperties()默认只能获取 标记为 public 的属性集合
            foreach (PropertyInfo i in peopleInfos)
            {
                Console.WriteLine(i.Name);
            }
            
            Console.Read();
            
            //----------------------------------------------------
            
            MethodInfo[] methodInfo = people.GetMethods();
            foreach (MethodInfo i in methodInfo)
            {
                Console.WriteLine(i.Name);
            }
            
            //----------------------------------------------------

        }

    }
    
    public class People // public class Custom
    {
        public int Id { get; set; }
        
        public string Name { get; set; }
        
        public string Address { get; set; }
        
        public People() { } // 新增一个 构造函数

        public bool Validate(People peopleObj) //新增Validate方法,用于校验入参的合法性
        {
            //Code to validate the eople object
            return true;
        }
    }
}

输出:

参考

posted @ 2021-05-10 19:11  抓水母的派大星  阅读(53)  评论(0编辑  收藏  举报