反射基础

反射是.NET中的重要机制,经过反射,能够在运行时得到程序或程序集中每个类型html

(包括类、结构、委托、接口和枚举等)的成员和成员的信息。性能

其实有些人会问, 像咱们日常引用DLL能够直接用, 为何要用反射?反射仍是对性能有影响的,优化

尽管能够经过优化反射的行为缩小之间性能的差距,可能这个时候对于性能要求毫秒级的需求, 那就要适当的取舍是否用反射。spa

(尽管对于大部分定制软件开发来讲, 软件都是一次开发, 而后二次维护, 不多大的需求面会更改)。插件

 

反射最大的好处就是, 插件化, 动态可配置, 扩展性强。当面临需求的变动亦或新增模块的状况,不用去改动源代码。code

1.利用Assembly去加载DLL程序集htm

利用微软现有的结局方案能够实现动态加载Dll程序集, 在System.Reflection命名空间下的Assemly。对象

1.新建一个控制台应用程序blog

2.新建一个类库ClassLibrary, 新建两个模型 一个Student类 , 一个School类接口

public class Student
    {
        public string name { get; set; }

        public string sex = "";

        public void Hay()
        {
            Console.WriteLine("大家好");
        }

        public void Hay(string name)
        {
            Console.WriteLine(name + "你好");
        }


        public void GoodBye<T>(T name)
        {
            Console.WriteLine(name + "再见");
        }

        private void GoodBye()
        {
            Console.WriteLine("再见");
        }

        public static void StaticMethod()
        {
            Console.WriteLine("私有方法...");
        }
    }
 public class School
    {
    }

//利用Assembly.Load方法读取外部的DLL程序集 【默认加载根目录下面DLL】

 //反射加载外部DLL
            Assembly ass = Assembly.Load("ClassLibrary"); //默认加载根目录下面DLL

 

//获取程序的Modules

复制代码
//获取全部模块
            foreach (var item in ass.GetModules())
            {
                Console.WriteLine(item.FullyQualifiedName);
            }
复制代码

 

//获取属性, 方法, 字段

复制代码
 foreach (var item in ass.GetTypes()) //
            {
                Console.WriteLine(item.FullName); //获取DLL中全部的命名空间

                foreach (var sub in item.GetProperties()) //公开属性
                {
                    Console.WriteLine(item.Name + "公开属性:" + sub.Name);
                }
                foreach (var sub in item.GetMethods()) //公开方法
                {
                    Console.WriteLine(item.Name + "公开方法:" + sub.Name);
                }
                foreach (var sub in item.GetFields()) //公开字段
                {
                    Console.WriteLine(item.Name + "公开字段:" + sub.Name);
                }
            }
复制代码

 

//反射建立实例对象

复制代码
foreach (var item in ass.GetTypes())
            {
                if (item.Name.Contains("Student")) //ClassLibrary.Student
                {
                    //使用Activator 动态去建立一个实例对象, 调用其中的公开方法
                    Student stu = (Student)Activator.CreateInstance(item);
                    stu.Hay();
                }
            }
复制代码

 

//反射调用实例方法、静态方法、重载方法、私有方法、泛型方法

复制代码
  foreach (var item in ass.GetTypes())
            {
                if (item.Name.Contains("Student"))
                {
                    //Student实例对象
                    object obj = Activator.CreateInstance(item);

                    //实例方法
                    MethodInfo method = item.GetMethod("Hay", new Type[] { });
                    method.Invoke(obj, null);

                    //重载方法
                    MethodInfo method1 = item.GetMethod("Hay", new Type[] { typeof(string) }); //带参数Hay
                    method1.Invoke(obj, new object[] { "哥哥" });

                    //静态方法
                    MethodInfo method2 = item.GetMethod("StaticMethod");
                    method2.Invoke(null, null);

                    //私有方法
                    MethodInfo method3 = item.GetMethod("GoodBye", BindingFlags.Instance | BindingFlags.NonPublic);
                    method3.Invoke(obj, null);

                    //泛型方法
                    MethodInfo method4 = item.GetMethod("GoodBye");
                    method4 = method4.MakeGenericMethod(typeof(string)); //重点,为泛型声明指定类型
                    method4.Invoke(obj, new object[] { "泛型," });

                }
            }
复制代码

 

//反射字段属性: GetValue SetValue

复制代码
foreach (var item in ass.GetTypes())
            {
                if (item.Name.Contains("Student"))
                {
                    object obj = Activator.CreateInstance(item);

                    foreach (var sub in item.GetProperties())
                    {
                        sub.SetValue(obj, "Mobike"); //SetValue
                        Console.WriteLine(sub.GetValue(obj)); //GetValue
                    }
                }
            }
复制代码

 

源文:

http://www.javashuo.com/article/p-eiyuurmv-ba.html

相关文章
相关标签/搜索