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 TOP 1000 [ID] ,[UserName] ,[UserPwd] ,[Age] ,[Email] ,[Birth] ,[UserImg] ,[Gender] ,[UserTypeName] ,[MvcUserTypeID] 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; } }}
转载于:https://www.cnblogs.com/ZkbFighting/p/7612031.html
相关资源:java反射机制知识点