• C#_反射机制


    一:反射的定义

      审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。

      System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码

      System.Reflection.Assembly 
      System.Reflection.MemberInfo
      System.Reflection.EventInfo
      System.Reflection.FieldInfo
      System.Reflection.MethodBase
      System.Reflection.ConstructorInfo
      System.Reflection.MethodInfo
      System.Reflection.PropertyInfo
      System.Type   

      

    二:获取类型信息: 

    class MyClass
            {
                public string m;
                public void test() { }
                public int MyProperty { get; set; }
            }

            //获取类型信息
            protected void Button1_Click(object sender, EventArgs e)
            {
                Type type = typeof(MyClass);
                Response.Write("类型名:" + type.Name);
                Response.Write("<br/>");
                Response.Write("类全名:" + type.FullName);
                Response.Write("<br/>");
                Response.Write("命名空间名:" + type.Namespace);
                Response.Write("<br/>");
                Response.Write("程序集名:" + type.Assembly);
                Response.Write("<br/>");
                Response.Write("模块名:" + type.Module);
                Response.Write("<br/>");
                Response.Write("基类名:" + type.BaseType);
                Response.Write("<br/>");
                Response.Write("是否类:" + type.IsClass);
                Response.Write("<br/>");
                Response.Write("类的公共成员:");
                Response.Write("<br/>");
                MemberInfo[] memberInfos = type.GetMembers();//得到所有公共成员
                foreach (var item in memberInfos)
                {
                    Response.Write(string.Format("{0}:{1}", item.MemberType, item));
                    Response.Write("<br/>");
                }
            }

    三:获取程序集信息

    protected void Button2_Click(object sender, EventArgs e)
    {
        //获取当前执行代码的程序集
        Assembly assem = Assembly.GetExecutingAssembly();
     
        Response.Write("程序集全名:"+assem.FullName);
        Response.Write("<br/>");
        Response.Write("程序集的版本:"+assem.GetName().Version);
        Response.Write("<br/>");
        Response.Write("程序集初始位置:"+assem.CodeBase);
        Response.Write("<br/>");
        Response.Write("程序集位置:"+assem.Location);
        Response.Write("<br/>");
        Response.Write("程序集入口:"+assem.EntryPoint);
        Response.Write("<br/>");
     
        Type[] types = assem.GetTypes();
        Response.Write("程序集下包含的类型:");
        foreach (var item in types)
        {
            Response.Write("<br/>");
            Response.Write("类:"+item.Name);
        }
    }

    四:反射调用方法

    protected void Page_Load(object sender, EventArgs e)
     {  
         System.Reflection.Assembly ass = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory+"bin\WebApplication1.dll"); //加载DLL
         System.Type t = ass.GetType("WebApplication1.MainPage");//获得类型
     
           string name=typeof(MainPage).AssemblyQualifiedName;
         System.Type t1 = Type.GetType(name);
    System.Type t2 = typeof(MainPage);
     
         object o = System.Activator.CreateInstance(t);//创建实例
           System.Reflection.MethodInfo mi = t.GetMethod("RunJs1");//获得方法
           mi.Invoke(o, new object[] { this.Page, "alert('测试反射机制')" });//调用方法
     
           System.Reflection.MethodInfo mi1 = t.GetMethod("RunJs");
         mi1.Invoke(t, new object[] { this.Page, "alert('测试反射机制1')" });//调用方法
     }
     
    反射调用方法

     

    五:反射调用用户/自定义控件

    protected override void OnInit(EventArgs e)
            {  
                //生成控件
                  CreateControl();
                base.OnInit(e);
            }
     
            private void CreateControl()
            {
                Table tb = new Table();
                TableRow dr = new TableRow();
                TableCell cell = new TableCell();
                Control c = <span style="color: #ff0000;">LoadControl("WebUserControl1.ascx");
    </span>            cell.Controls.Add(c);
                dr.Cells.Add(cell);
                tb.Rows.Add(dr);
                this.PlaceHolder1.Controls.Add(tb);
            }
     
            protected void Button1_Click(object sender, EventArgs e)
            {
                foreach (TableRow tr in PlaceHolder1.Controls[0].Controls)
                {
                    foreach (TableCell tc in tr.Controls)
                    {
                        foreach (Control ctl in tc.Controls)
                        {
                            if (ctl is UserControl)
                            {
                                Type type = ctl.GetType();
                                System.Reflection.MethodInfo methodInfo = type.GetMethod("GetResult");
                                string selectedValue = string.Concat(methodInfo.Invoke(ctl, new object[] { }));
     
                                Response.Write(selectedValue);
                                break;
                            }
                        }
                    }
                }
            }
    反射调用用户、自定义控件

     

    六:反射实现工厂模式
    public partial class 反射 : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                string typeName = typeof(TestClass).AssemblyQualifiedName;
                ITestInterface iface = RawGenericFactory.Create<ITestInterface>(typeName);
                string result = iface.doSomething();
                Response.Write(result);
            }
        }
     
        public static class RawGenericFactory
        {
            public static T Create<T>(string typeName)
            {
                //Activator.CreateInstance 反射 根据程序集创建借口或者类
                //Type.GetType() 根据名称获得程序集信息
                //typeof(ConcertProduct).AssemblyQualifiedName
                //_iproduct.GetType().AssemblyQualifiedName
                return (T)Activator.CreateInstance(Type.GetType(typeName));
            }
        }
     
        public interface ITestInterface
        {
            string doSomething();
        }
     
        public class TestClass : ITestInterface
        {
            public int Id { get; set; }
            public override string ToString()
            {
                return Id.ToString();
            }
     
            public string doSomething()
            {
                return "ok";
            }
        }
     
    反射实现工厂模式

    七:自定义ORM框架

    [Orm.Table("TestORM")]
            public class TestORM
            {  
                [Orm.Colum("Id",DbType.Int32)]
                public int Id { get; set; }
                [Orm.Colum("UserName", DbType.String)]
                public string UserName { get; set; }
                [Orm.Colum("Password", DbType.String)]
                public string Password { get; set; }
                [Orm.Colum("CreatedTime", DbType.DateTime)]
                public DateTime CreatedTime { get; set; }
            }
     
     
            protected void Button3_Click(object sender, EventArgs e)
            {
                TestORM t = new TestORM()
                {
                    Id=1,
                    UserName="binfire",
                    Password="xxx",
                    CreatedTime=DateTime.Now
                };
                Orm.OrmHelp h=new Orm.OrmHelp();
                h.Insert(t);
            }
     
    namespace Orm
    {
        [AttributeUsageAttribute(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
        public class TableAttribute : Attribute
        {
            //保存表名的字段
            private string _tableName;
     
            public TableAttribute()
            {
            }
     
            public TableAttribute(string tableName)
            {
                this._tableName = tableName;
            }
     
            ///
     
            /// 映射的表名(表的全名:模式名.表名)
            ///
            public string TableName
            {
                set
                {
                    this._tableName = value;
                }
                get
                {
                    return this._tableName;
                }
            }
        }
     
        [AttributeUsageAttribute(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
        public class ColumAttribute : Attribute
        {
            private string _columName;
     
            private DbType _dbType;
     
     
            public ColumAttribute()
            {
            }
     
            public ColumAttribute(string columName)
                : this()
            {
                this._columName = columName;
            }
     
            public ColumAttribute(string columName, DbType dbType)
                : this(columName)
            {
                this._dbType = dbType;
            }
     
            //列名
            public virtual string ColumName
            {
                set
                {
                    this._columName = value;
                }
                get
                {
                    return this._columName;
                }
            }
     
            //描述一些特殊的数据库类型
            public DbType DbType
            {
                get { return _dbType; }
                set { _dbType = value; }
            }
     
        }
     
        public class OrmHelp
        {
            public void Insert(object table)
            {
                Type type = table.GetType();
                //定义一个字典来存放表中字段和值的对应序列
                Dictionary<string,string> columValue = new Dictionary<string,string>();
                StringBuilder SqlStr = new StringBuilder();
                SqlStr.Append("insert into ");
                //得到表名子
                TableAttribute temp = (TableAttribute)type.GetCustomAttributes(typeof(TableAttribute), false).First();
                SqlStr.Append(temp.TableName);
                SqlStr.Append("(");
                PropertyInfo[] Propertys = type.GetProperties();
                foreach (var item in Propertys)
                {
                    object[] attributes = item.GetCustomAttributes(false);
                    foreach (var item1 in attributes)
                    {
                        //获得相应属性的值
                        string value = table.GetType().InvokeMember(item.Name, System.Reflection.BindingFlags.GetProperty, null, table, null).ToString();
                        ColumAttribute colum = item1 as ColumAttribute;
                        if (colum != null)
                        {
                            columValue.Add(colum.ColumName, value);
                        }
                    }
                }
                //拼插入操作字符串
                foreach (var item in columValue)
                {
                    SqlStr.Append(item.Key);
                    SqlStr.Append(",");
     
                }
                SqlStr.Remove(SqlStr.Length - 1, 1);
                SqlStr.Append(") values('");
                foreach (var item in columValue)
                {
                    SqlStr.Append(item.Value);
                    SqlStr.Append("','");
     
     
                }
                SqlStr.Remove(SqlStr.Length - 2, 2);
                SqlStr.Append(")");
     
                HttpContext.Current.Response.Write(SqlStr.ToString());
     
            }
        }
    }
    自定义ORM
  • 相关阅读:
    springboot设置Https请求
    mac OS 搭建PHP项目开发环境
    javascript SDK开发之webpack中eslint的配置
    Linux用户空间内存区域的匿名映射
    Ubuntu上架设PPPoE Server
    20060518: Alert!
    Unity3D的坑系列:打包Assetbundle丢失Shader问题(贴图显示不了)
    RequestDispatcher.forward() 方法和HttpServletResponse.sendRedirect()方法的区别
    类和对象、封装、继承、多态
    Linux命令(4):touch
  • 原文地址:https://www.cnblogs.com/ingstyle/p/6762180.html
Copyright © 2020-2023  润新知