反射机制

:反射的定义

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

  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);
    }
}<br>

四:反射调用方法

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')" });//调用方法
 }<br>

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

       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;
                        }
                    }
                }
            }
        }<br>
        ```
六:反射实现工厂模式

public partial class 反射 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string typeName = typeof(TestClass).AssemblyQualifiedName;
ITestInterface iface = RawGenericFactory.Create(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";
    }
}<br>
```

七:自定义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());

        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值