zoukankan      html  css  js  c++  java
  • 反射的相关知识点

    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;
            }
        }
    }
  • 相关阅读:
    while循环
    No.四
    No. three
    第二章吧
    第二次写博客
    我人生的第一个程序,相当于哥伦布发现新大路。
    orale命令6 rman备份
    oracle 命令4 热备份
    oracle命令3 冷备份
    oracle命令2 和一致性关闭、非一致性关闭
  • 原文地址:https://www.cnblogs.com/ZkbFighting/p/7612031.html
Copyright © 2011-2022 走看看