反射

反射:简单的理解就是动态调用程序集,通过类型元数据创建对象,调用对象的成员等.
1.反射无处不在,我们天天在使用,vs的智能提示,就是通过反射获取到类的属性、方法等,还有反编译工具也是通过反射实现。
2.反射:就是动态获取程序集中的元数据来操作类型的。
3.Type类实现反射的一个重要的类,通过它我们可以获取类中的所有信息,包括方法、属性等,可以动态调用类的属性、方法,Type是对类的描述,如何获取Person类中的所有属性?
4.反射就是直接通过.dll来创建对象,调用成员.
5.通过类型元数据来获取对象的一些相关信息,并且还可以实例化对象调用方法,这个就叫做"反射".

通过P/Invoke调用其它语言写的dll文件

实例一:

class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();
        Type type1 = p.GetType();
        //获取当前实例
        Type type2 = typeof(Person);
        //获取当前类型的父类,可以获取父类的父类
        Console.WriteLine(type2.BaseType.ToString());
        //Console.WriteLine(type2.BaseType.BaseType.ToString());
        //获取当前类型中所有字段信息,这里只能获取私有字段
        FieldInfo[] fields = type2.GetFields();
        foreach (var item in fields)
        {
            Console.WriteLine(item.Name);
        }
        //获取当前类型中所有属性名称
        PropertyInfo[] profInfo = type2.GetProperties();
        foreach (var item in profInfo)
        {
            Console.WriteLine(item.Name);
        }
        Console.ReadKey();
    }
}

class Person
{
    public string field1;
    public string field2;
    public string Name { get; set; }
    public int Age { get; set; }
    public void SayHi()
    {
        Console.WriteLine("Hi");
    }
}

 实例二:获取程序集里面的类、方法

//根据程序的路径,动态加载程序集
Assembly asm = Assembly.LoadFile(@"C:\用户目录\我的文档\visual studio 2012\Projects\Reflact\Reflact\bin\Debug\Reflact.dll");
//获取该程序集的所有类型
Type[] type = asm.GetTypes();
foreach (var item in type)
{
    Console.WriteLine(item.FullName);
}
//获取该程序集的所有public类型
Type[] type2 = asm.GetExportedTypes();
foreach (var item in type2)
{
    Console.WriteLine(item.FullName);
}
//获取指定的类型
Type type = asm.GetType("Reflact.TestReflact");
//获取某个类型中的成员,调用
MethodInfo method = type.GetMethod("SayHi");
//创建一个TestReflact类型的对象
//根据指定的Type,创建一个该类型的对象
object obj = Activator.CreateInstance(type);
//调用该方法
method.Invoke(obj, null);
//调用相同方法名没有参数的方法
MethodInfo method2 = type.GetMethod("SayHello", new Type[] { });
method2.Invoke(obj, null);
//调用相同方法名有参数的方法
MethodInfo method3 = type.GetMethod("SayHello", new Type[] { typeof(string) });
method3.Invoke(Activator.CreateInstance(type), new object[] { "张三" });
//如果方法有返回值的话,直接接收Invoke()方法的返回值就可以了
//string result = (string)method3.Invoke(Activator.CreateInstance(type), new object[] { "张三" });
Console.ReadKey();

 

posted @ 2015-10-18 15:32  黄者之风  阅读(187)  评论(0编辑  收藏  举报