zoukankan      html  css  js  c++  java
  • C#反射是什么?

    	//反射是.NET中的重要机制,通过反射,可以在运行时获得.NET中每一个类型
    	//(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。
    	//有了反射,即可对每一个类型了如指掌,如果获得了构造函数的信息,即可直接创建对象
    	class Program
        {
            //反射可以看到类的属性和方法,设置和获取属性值,调用方法
            //    {   GetProperties  获取属性
            //Type      
            //    {   GetMethods     获取方法
            //
            //                  {   GetValue(实例)
            //属性 ProPertyInfo       
            //                  {   SetValue(实例,值)
            //
            //方法 MethodInfo    invoke(实例,参数)
            //
            static void Main(string[] args)
            {
                Stu s = new Stu() { Name = "占山" };
                Stu s2 = new Stu() { Name = "王五" };
    
                Type t = s.GetType();
    
                //获取所有属性名称
                var ps = t.GetProperties();
                //获取所有方法名称
                var ms = t.GetMethods();
    
                //显示属性
                foreach (var i in ps)
                {
                    Console.WriteLine(i.Name);
                }
    
                Console.WriteLine("-----------------------");
                Console.WriteLine("-----------------------");
    
                //显示方法  前面两个是只读和只写的两个方法,第三个是咱们定义的方法,后面四个是继承自Object的方法
                foreach (var j in ms)
                {
                    Console.WriteLine(j.Name);
                }
                Console.WriteLine("-----------------------");
                Console.WriteLine("-----------------------");
    
                //给第一个学生赋值
                ps[0].SetValue(s, "里斯");
                //读取值
                Console.WriteLine(s.Name);
                
                //获取第二学生的姓名
                Console.WriteLine(ps[0].GetValue(s2));
    
                Console.WriteLine("-----------------------");
                Console.WriteLine("-----------------------");
    
                //调用方法,第一个值是学生信息,第二个是方法参数,没有参数就传null
                ms[2].Invoke(s, new object[] { "Hello","World"});
    
                Console.Read();
            }
    
            //学生类
            class Stu
            {
                public string Name { get; set; }
    
                public void Say(string a1, string a2)
                {
                    Console.WriteLine(a1+" "+a2);
                }
            }
            
    		//动态加载dll文件
            static void Main(string[] args)
            {
                // 路径E盘下的dll文件
                Assembly a = Assembly.LoadFile(@"e:ClassLibrary1.dll");
                //获取所有类型
                //Type[] atypess = a.GetTypes();
                //foreach (Type t1 in atypess)
                //{
                //    Console.WriteLine(t1);
                //}
    
                //类型全名
                var s = a.CreateInstance("ClassLibrary1.Stu");
                //类型全名
                Type t = a.GetType("ClassLibrary1.Stu");
                //要获取的属性名
                var name = t.GetProperty("Name");
                var age = t.GetProperty("Age");
                //赋值
                name.SetValue(s, "张三");
                age.SetValue(s, 19);
    
                //获取方法
                MethodInfo m = t.GetMethod("Say");
                //调用方法,传入对应参数
                m.Invoke(s,new object[] { "晚上"});
    
    
                Console.ReadKey();
            }
        }
    
  • 相关阅读:
    Understand each field of AWR [ID 884046.1]
    Linux iptables 防火墙 添加删除 端口
    SCSI 总线和协议
    How to create physical standby database with 11g RMAN DUPLICATE FROM ACTIVE DATABASE [ID 747250.1]
    How to create physical standby database with 11g RMAN DUPLICATE FROM ACTIVE DATABASE [ID 747250.1]
    Linux iptables 防火墙 添加删除 端口
    Oracle alert log 按天 存放 脚本
    文件系统 和 网络附接存储(NAS: Network Attached Storage)
    SCSI 总线和协议
    IP(Internet Protocal) 地址 说明
  • 原文地址:https://www.cnblogs.com/xuxueming/p/11913704.html
Copyright © 2011-2022 走看看