我的理解反射應該就是根據類型建立對象,而後調用一些方法。使用反射時能夠不引用命名空間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();
//方法的調用與單例的破壞 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();
//獲取屬性和賦值 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
//數據庫層的封裝,經過實體類與數據庫的表對應,這裏的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; }