反射的相关知识点

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