反射的相关知识点
namespace 反射 { class Program { //创建了类库,在文件中会生成bin--Debug 的文件夹存储Dll的文件夹 //using System.Reflection; 反射为了动态 //反射的原理:类库编译后生成dll(应用和程序的扩展)和pdb(Program Debug Databases)文件 //dll包含:IL( 中间语言),metadata(元数据)对IL的描述 //Reflection 读取元数据知道IL或者Dll有哪些类和属性 //通过反射获取dll信息,创建对象,调用方法 static void Main(string[] args) {# region 写死的引用接口 ////接口 可以实例化一个继承他的类 //IDBHelper dbHelper = new DBHelper(); //dbHelper.Query(); # endregion# region 动态加载反射 ////1.先加载 2.找类型 3.创建对象 4.类型转换 ////反射的入口,动态加载dll ////反射可以灵活的调用配置的文件 //Assembly assembly = Assembly.Load("Ruanmou.DB.Sqlserver"); //Console.WriteLine("*************Reflection*********************"); //foreach (Module item in assembly.GetModules()) //{ // //展示的这些数据都来自元数据, // Console.WriteLine("名称{0}", item.FullyQualifiedName); //} //Console.WriteLine("*************GetMOdules*********************"); //foreach (Type item in assembly.GetTypes()) //{ // Console.WriteLine("名称{0}", item.FullName); //} //Console.WriteLine("*************创建对象*********************"); ////基于类的完整名称 找出类型 ////1.先加载 2.找类型 3.创建对象 4.类型转换 //Type dbHelperType = assembly.GetType("Ruanmou.DB.Sqlserver.DBHelper"); ////根据类型创建对象 ////1.先加载 2.找类型 3.创建对象 4.类型转换 //object oDbHelper = Activator.CreateInstance(dbHelperType); //Console.WriteLine(oDbHelper); ////Is 是判断类型对不对 //IDBHelper dbHelperReflection = (IDBHelper)oDbHelper; ////1.先加载 2.找类型 3.创建对象 4.类型转换 5. 调用方法 //dbHelperReflection.Query();//完成方法的调用 //Console.ReadKey(); # endregion People people = new People(); people.Id = 132; people.Name = "猪八戒"; //如果通过反射来施行 //1.找到类型 Type type = typeof(People); //2.找到类型,创建对象 object oObject = Activator.CreateInstance(type); //Activator:包含特定的方法,用以在本地或远程创建类型 foreach(var item in type.GetProperties()) //type.GetProperties()找出所有类型的所有属性 { if(item.Name.Equals("Id")) { item.SetValue(oObject, 12); //可以给对象赋值 SetValue赋值 } if(item.Name.Equals("Name")) { item.SetValue(oObject, "煮开你"); } Console.WriteLine("属性名称{0},值是{1}", item.Name, item.GetValue(oObject)); //GetValue 获取 //属性名称Id,值是0,,,,,,,Activator.CreateInstance(type)创建的默认值是0和null(诺) //属性名称Name,值是null } DBHelper dbHelper = new DBHelper(); Users user = dbHelper.QueryDomain < Users > (); Console.ReadLine(); } } }
=============================================
namespace Ruanmou.DB.Interface { public interface IDBHelper { void Query(); } }
==============================================
namespace Ruanmou.DB.Sqlserver { public class DBHelper: IDBHelper { private static string ConnectionString = ConfigurationManager.ConnectionStrings["xxxx"].ConnectionString; public DBHelper() { Console.WriteLine("这里是{0}的无参数构造函数", this.GetType().FullName); } public void Query() { //this指的是Ruanmou.DB.Sqlserver.DBHelper 当前类 Console.WriteLine("这里是{0}的Query", this.GetType().FullName); } public T QueryDomain < T > () { Type type = typeof(T); T t = (T) Activator.CreateInstance(type); //创建对象 foreach(var item in type.GetProperties()) //type.GetProperties()找出所有类型的所有属性 { Console.WriteLine("属性名称{0},值是{1}", item.Name); //得到type里所用的字段 } //将所有的属性的名字链接起来并且给每一个字段加了中括号,加中括号可以过滤关键字 string colums = string.Join(",", type.GetProperties().Select(p => string.Format("[{0}]", p.Name))); /* SELECT * FROM [MVC1].[dbo].[MvcUsers] */ int id = 2; string sql = string.Format("select {0} from {1} where id={2}", colums, type.Name, id); using(SqlConnection conn = new SqlConnection(ConnectionString)) { SqlCommand command = new SqlCommand(sql, conn); conn.Open(); SqlDataReader reader = command.ExecuteReader(CommandBehavior.CloseConnection); if(reader.Read()) { foreach(var item in type.GetProperties()) //type.GetProperties()找出所有类型的所有属性 { string propName = item.Name; item.SetValue(t, reader[propName]); Console.WriteLine("属性名称{0},值是{1}", item.Name, item.GetValue(t)); //GetValue 获取 } } } return default(T); } } }
namespace Ruanmou.Model { public class People { public People() { Console.WriteLine("{0}被创建", this.GetType().FullName); } public int Id { set; get; } public string Name { set; get; } } }
人各有命,上天注定,有人天生为王,有人落草为寇。脚下的路,如果不是你自己的选择,那么旅程的终点在哪,也没人知道。你会走到哪,会遇到谁,都不一定。