C#_反射机制

时间:2023-08-04 18:53:32

一:反射的定义

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

  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[].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=,
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 - , );
SqlStr.Append(") values('");
foreach (var item in columValue)
{
SqlStr.Append(item.Value);
SqlStr.Append("','"); }
SqlStr.Remove(SqlStr.Length - , );
SqlStr.Append(")"); HttpContext.Current.Response.Write(SqlStr.ToString()); }
}
}

自定义ORM