首页 > 代码库 > C#_反射机制

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 = http://www.mamicode.com/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 = http://www.mamicode.com/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 = http://www.mamicode.com/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

 

C#_反射机制