zoukankan      html  css  js  c++  java
  • Intern Day82

    个人理解

    今天下午花了三个小时大概学习了一下,我的理解就是,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;
            }
        }
    }
    

    输出:

    参考

  • 相关阅读:
    Windows 7 NVMe补丁(包括官网下载链接)
    最近做的项目的数据处理及可视化小结
    debugging tools for windows 10下载安装问题
    QT安装过程中出现的问题
    Datasnap 中序列化和反序列化
    C# POST multipart/form-data 方式提交数据
    Delphi的前景
    Delphi 禁止重复运行同一程序的方法
    Delphi7 打开工程报错 '找不到指定的模块'&'EOIesysError'
    Delphi7 “cannot Create output File ..inproject1.exe”
  • 原文地址:https://www.cnblogs.com/OFSHK/p/14752445.html
Copyright © 2011-2022 走看看