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[].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
C#_反射机制的更多相关文章
- 尚学堂 213_尚学堂_高淇_java300集最全视频教程_反射机制_提高反射效率_操作泛型_操作注解_合并文件.mp4
在反射的时候如果去掉了安全性检测机制,能够大大的提高反射的执行效率,我们来看下面的代码进行比较 package com.bjsxt.test; import java.lang.reflect.Met ...
- JAVA反射机制_获取字节码文件对象
是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...
- [19/04/17-星期三] Java的动态性_反射(Reflection)机制
一.前言 动态语言:程序运行时,可以改变程序结构或变量类型.典型的代表:Python,ruby,JavaScript 如JavaScript代码: function test(){ var s=&qu ...
- luogg_java学习_10_异常_反射
本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 异常_反射 异常 异常就是导致程序中断执行的一段指令流 ...
- C++实现反射机制
NET下的很多技术都是基于反射机制来实现的,反射让.NET平台下的语言变得得心应手.最简单的,比如枚举类型,我们我可以很容易的获得一个枚举变量的数值以及其名称字符串. 可是,在C++中,枚举变量本质上 ...
- JavaSE学习总结第27天_反射 & 设计模式 & JDK5、7、8新特性
27.01 反射_类的加载概述和加载时机 类的加载:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载:就是指将class文件读 ...
- Java反射机制(Reflect)解析
一.导读 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计 ...
- java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值
1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...
- Java反射机制调用对象的方法 —— 将一个对象的属性值赋值给另一个对象的属性
模拟一个场景: 众所周知,EasyExcel导出Excel文档是依赖于注解完成的,在实体类需要导出的属性上面加上注解,导出的时候会自动识别该属性. 假如我们现在需要导出用户的信息,又不想污染原本的实体 ...
随机推荐
- django学习之命令
1.启动一个django项目: $ django-admin startproject <project-name> 2.创建一个应用: $ python manage.py starta ...
- solr搜索引擎配置使用mongodb作为数据源
环境说明: 操作系统:由于是使用的docker直接拉取的镜像部署的,系统是LINUX环境 mongodb: 4.0.3 solr: 7.5.0 python: 3.5 配置mongodb 1.拉取mo ...
- windows10 VM12 安装Mac OS X 10.11
转载自:http://blog.csdn.net/j755ing/article/details/69400439 第一步: 下载 材料/工具: 下载 VMware Workstation 12 Pr ...
- Excel的快速录入
数据有效性: 1.选择要限制数据有效性的区域: 2.点开[数据]选项卡选择”数据验证“: 3.[设置]中选择”序列": 4.若手动输入则需要将内容使用英文符号分割开来(比如:A级,B级): ...
- 高通移植mipi LCD的过程LK代码
lk部分:(实现LCD兼容) 1. 函数定位 aboot_init()来到target_display_init(): 这就是高通原生lk LCD 兼容的关键所在.至于你需要兼容多少LCD 就在whi ...
- Python基础知识:字典
1.字典中键-值为一对,keys()返回一个列表,包含字典中所有键,values()返回所有值 favorite_languages ={ 'jack':"python", 'al ...
- January 11th, 2018 Week 02nd Thursday
Live, travel, adventure, bless, and don't be sorry. 精彩地活着,不停地前行,大胆冒险,心怀感激,不留遗憾. Everything we do is ...
- IntelliJ IDEA 项目结构旁边出现 0%classes,0% lines covered
不知道一不小心点到哪里,项目变成如下形式 使用ctrl + Alt + F6弹出如下框,取消勾选-->点击Show Selected就可以去掉了 官网解释
- 【BZOJ4946】[NOI2017]蔬菜(贪心)
[BZOJ4946][NOI2017]蔬菜(贪心) 题面 BZOJ 洛谷 UOJ 题解 忽然发现今年\(NOI\)之前的时候切往年\(NOI\)的题目,就\(2017\)年的根本不知道怎么下手(一定是 ...
- spring mvc 中web.xml配置信息解释
在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...