反射

我的理解反射應該就是根據類型建立對象,而後調用一些方法。使用反射時能夠不引用命名空間sql

主要爲如下三步
Assembly assembly = Assembly.Load("DB.Sqlserver");//反射的入口,根據類庫的名稱,動態加載dll
主要爲如下兩步,由於類型的獲取也能夠經過實例化;
eg:People people = new People();Type type = assembly.GetType(people);//type = typeof(people);
Type type = assembly.GetType("DB.Sqlserver.ReflectionTest");//基於類的完整名稱 找出類型
object oObject = Activator.CreateInstance(type);//根據類型,建立對象

可用於如下幾種狀況:

1 依賴接口,完成可配置可擴展數據庫

2 去掉接口,反射調用方法,包括私有方法ide

3. 反射破壞單例spa

4 反射獲取屬性和賦值code

5 封裝數據庫訪問層orm

代碼以下:server

//經過反射獲取信息、建立對象、調用方法,並經過其dll,pdf文件是可配置擴展

            Console.WriteLine("*******************反射第一節*******************");
            IDBHelper iDBHelper = new DBHelper();
            iDBHelper.Query();
            string nameSpace = ConfigurationManager.AppSettings["DB.Interface.IDBHelper"];
            string[] nameSpaceArray = nameSpace.Split(',');

            //Assembly assembly = Assembly.Load("DB.Sqlserver");//反射的入口,加載dll文件
            Assembly assembly = Assembly.Load(nameSpaceArray[0]);
            Console.WriteLine("*********************GetModules*********************");
            foreach (Module module in assembly.GetModules())
            {
                Console.WriteLine("名稱:{0}", module.FullyQualifiedName);
            }
            Console.WriteLine("*********************GetType*********************");
            foreach (Type type in assembly.GetTypes())
            {
                Console.WriteLine("名稱:{0}", type.FullName);
            }
            Console.WriteLine("*********************建立對象*********************");
            //Type dbHelperType = assembly.GetType("DB.Sqlserver.DBHelper");/基於類的完整名稱 找出類型
            Type dbHelperType = assembly.GetType(nameSpaceArray[1]);//基於類的完整名稱 找出類型
            object oDBHelper = Activator.CreateInstance(dbHelperType);//建立對象 
            IDBHelper dbHelperReflection = (IDBHelper)oDBHelper;//可用is 而後as 進行判斷
            dbHelperReflection.Query();
            //(oDBHelper is IDBHelper) as IDBHelper; 錯誤寫法
            Console.WriteLine("請在鍵盤上按下任意一個鍵,而後開始執行下一步。");
            Console.ReadKey();
View Code
 
 
//方法的調用與單例的破壞
            Assembly assembly = Assembly.Load("DB.Sqlserver");//反射的入口,動態加載dll
            Type type = assembly.GetType("DB.Sqlserver.ReflectionTest");//基於類的完整名稱 找出類型
            object oObject = Activator.CreateInstance(type);//根據類型,建立對象
            Console.WriteLine("*********************GetMethods*********************");
            foreach (MethodInfo method in type.GetMethods())
            {
                Console.WriteLine("名稱:{0}", method.Name);
            }
            MethodInfo show_1 = type.GetMethod("Show1");//無參調用
            show_1.Invoke(oObject, null);
            MethodInfo show_2 = type.GetMethod("Show2");//含參調用
            show_2.Invoke(oObject, new object[] { 1 });
            Console.WriteLine("*********************重載方法的調用*********************");
            MethodInfo show3_1 = type.GetMethod("Show3", new Type[] { });//無參
            show3_1.Invoke(oObject, null);

            MethodInfo show3_2 = type.GetMethod("Show3", new Type[] { typeof(int) });//int
            show3_2.Invoke(oObject, new object[] { 32 });

            MethodInfo show3_3 = type.GetMethod("Show3", new Type[] { typeof(string) });//字符串
            show3_3.Invoke(oObject, new object[] { "3_3" });
            Console.WriteLine("*********************私有方法的調用*********************");
            MethodInfo show_4 = type.GetMethod("Show4", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
            show_4.Invoke(oObject, new object[] { "黑科技之私有方法的調用" });

            Type typeSingle = assembly.GetType("DB.Sqlserver.Singleton");
            object oObjectSingle = Activator.CreateInstance(typeSingle, true);
            Console.ReadKey();
View Code
//獲取屬性和賦值
            Console.Writeln("*****Common*****"); 
            People people = new People();
            people.Id = 11;
            people.Name = "笨鳥";
            Console.WriteLine("People.Id={0},People.Name={1}", people.Id, people.Name);
            //用反射實現
            Type type = typeof(People);// people.GetType().FullName; 找到類型
            Object oObject = Activator.CreateInstance(type);//建立對象
            foreach (var prop in type.GetProperties())
            {
                if (prop.Name.Equals("Id"))
                {
                    prop.SetValue(oObject, 12);
                }
                if (prop.Name.Equals("Name"))
                {
                    prop.SetValue(oObject, "信天游");
                }
                Console.WriteLine("屬性名稱爲{0},值是{1}", prop.Name, prop.GetValue(oObject));
            }
            DBHelper dbHelper = new DBHelper();
            User user = dbHelper.QueryDomain<User>();
            Console.ReadKey();
            #endregion
View Code
//數據庫層的封裝,經過實體類與數據庫的表對應,這裏的T對應的則是一個User實體類
private static string ConnectionStringCustomers = ConfigurationManager.ConnectionStrings["SqlconnString"].ConnectionString;
 public T QueryDomain<T>()
        {
            int id =1;
            Type type = typeof(T);
            T t = (T)Activator.CreateInstance(type);
            //[],中括號的做用是預防關鍵字
            string columns = string.Join(",",type.GetProperties().Select(p=>string.Format("[{0}]",p.Name)));
            string sql = string.Format("Select {0} from [{1}] where Id = {2}",columns,type.Name,id);
            using (SqlConnection conn = new SqlConnection(ConnectionStringCustomers))
            {
                SqlCommand cmd = new SqlCommand(sql, conn);
                conn.Open();
                SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
                if(reader.Read())
                {
                    foreach(var prop in type.GetProperties())
                    {
                        string propertyName = prop.Name;
                        prop.SetValue(t, reader[propertyName]);
                        Console.WriteLine("屬性名稱爲{0},值是{1}", prop.Name, prop.GetValue(t));
                    }
                }
            }
            return t;
        }
View Code
相關文章
相關標籤/搜索