反射基礎

反射是.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

相關文章
相關標籤/搜索