反射reflection


一、reflection是什么?

反射(reflection)是什么?
在《精通C#》中是这么说的“反射就是一个运行库发现的过程”。

二、reflection获取信息

举例来说,通过反射,可以得到一个给定的.dll或.exe程序集所包含的所有类型的列表,这个列表包括给定类型定义的方法、字段、属性和事件。

namespace _01程序集的引用
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 加载程序集
            //获取基目录(也就是bin\deBug的绝对路径)
            string deBuyPath = AppDomain.CurrentDomain.BaseDirectory;
 
            //获取DeBug中的dll文件的绝对路径(通过类库项目生成的,我自己复制到那里的)
            //using System.IO;
            string dllPath = Path.Combine(deBuyPath, "ClassLibrary1.dll");
 
            //加载程序集文件(using System.Reflection;)
            Assembly ass = Assembly.LoadFile(dllPath); 
            #endregion
 
 
            Console.WriteLine("获取程序集中所有定义的类的类名,包括internal和public");
            Type[] allTypes = ass.GetTypes();
            foreach (Type item in allTypes)
            {
                Console.WriteLine($"程序集ClassLibrary1.dll中有类:{item.Name }");
            }
 
 
            //获取程序集中指定的类的类型
            Type p = ass.GetType("ClassLibrary1.Person");
            Console.WriteLine($"获取指定的类,类名{p.Name},类的命名空间{p.Namespace}");
 
 
            //获取所有程序集dll文件中定义的公共类型的类型(公共类)
            Type[] publicTypes = ass.GetExportedTypes();
 
 
            Console.ReadKey();
 
        }
    }
}
 

运行结果
-----------获取程序集中所有定义的类的类名,包括internal和public---------
程序集ClassLibrary1.dll中有类:Person
程序集ClassLibrary1.dll中有类:Student
程序集ClassLibrary1.dll中有类:Teacher
-----------获取程序集中指定的类的类型---------
获取指定的类,类名Person,类的命名空间ClassLibrary1
-----------获取程序集中公共类---------
程序集ClassLibrary1.dll中的公共类有:Person
程序集ClassLibrary1.dll中的公共类有:Student

namespace _02程序集的引用2
{
    class Program
    {
        static void Main(string[] args)
        {
            //查询变量的类型
 
            //法1:已经声明了一个变量
            string str = "abcd";
            Type t1 = str.GetType();
            Console.WriteLine(t1);
 
            //法2:直接使用变量类型查询
            Type t2 = typeof(string);
            Console.WriteLine(t2);
 
            //法3:直接使用Type.GetType()静态方法
            Type t3 = Type.GetType("System.String");
            Console.WriteLine(t3);
 
            //我们可以获得string的类型名,我们可以使用类型对象来探测string类型的内部结构
            foreach (MemberInfo item in t1.GetMembers ())
            {
                Console.WriteLine($"当前类型的公共成员类型{item.MemberType},成员名{item.Name }");
            }
 
 
            Console.ReadKey();
 
        }
    }
}

三、reflection去创建对象

我们知道了类库中的各个成员的的类型,那么我们怎么才能新建一个该类型的对象呢(这就是晚期加载)
注意啊,上面我们只是获得了各个类的类型(类名),并没有真正的获得这个类名这个变量
所以我们无法使用类名这个变量去new一个对象
建立程序集中类的对象

 
            //建立程序集中类的对象
            object person = Activator.CreateInstance(p, 24, "志铭", "男");
 
 
            #region 获取类型的属性
            //获取该对象的属性列表
            Console.WriteLine("--------获取该对象的属性列表---------");
            PropertyInfo[] pros = person.GetType().GetProperties();
            foreach (PropertyInfo item in pros)
            {
                Console.WriteLine(item.Name);
            }
 
            //获得指定名称的属性
            PropertyInfo pro = p.GetProperty("Name");
            //获得对象person的指定的属性的值
            string name = (string)pro.GetValue(person, null);
            Console.WriteLine(name);
            #endregion
 
 
            #region 获取类型的方法列表
            Console.WriteLine("-------获取类型的方法列表--------------");
            MethodInfo[] methods = person.GetType().GetMethods();
            foreach (MethodInfo item in methods)
            {
                Console.WriteLine(item.Name);
            }
 
            //调用指定名称的方法
            MethodInfo method = person.GetType().GetMethod("Say");
            method.Invoke(person, null);
            #endregion
 
            //获取字段列表(注意你只能获取公共类型的字段)
            FieldInfo[] fields = person.GetType().GetFields();
            foreach (FieldInfo item in fields)
            {
                Console.WriteLine(item.Name);
            }
            
            Console.ReadKey();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值