`
micc010
  • 浏览: 69032 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

ASP.NET反射机制

    博客分类:
  • .net
阅读更多
反射的定义:审查元数据并收集关於它的类型信息的能力,元数据(编辑后的基本数据单元)就是一大堆表,编译器会创建一个类定义表,一个字段定义表,一个方法定义表等,System.Reflection命名空间包含的几个类,允许你反射(解析)这些元数据的代码

一、反射的作用:


动态的创建类型的实例,将类型邦定到现有对象,或从现有对象中获取类型
应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射
反射主要应用於类库,这些类库需要知道一个类型的定义,以便提供更多的功能

二、应用要点:


现实应用程序中很少使用到反射
使用反射动态邦定需要牺牲性能
有些元数据信息是不能通过反射获取的
某些反射类型是专门為那些CLR开发编辑器开发使用的,所以你要意思到不是所有反射类型都是可以使用的

三、取得Assembly的方法:


Assembly.Load
Assembly.LoadFile
Assembly.LoadFrom
Type对象的Assembly方法

四、反射的成员:


MemberInfo-成员
ConstructorInfo-结构
FieldInfo-字段
MethodInfo-方法
PropertyInfo-属性
EventInfo-事件

五、根据反射取得对象的Member信息
private void WriteReflectionInfo()
{
Type testType = typeof(Test);
Assembly assembly = testType.Assembly;
Response.Write("Assembly:" + assembly.FullName + "<br/>");

Type[] typeList = assembly.GetTypes();   // 获取类型
// 针对每个类型获取详细信息
foreach (Type type in typeList)
{
    Response.Write("------------------------" + type.Namespace + type.Name + "------------------------<br/>");
    // 获得类型的结构信息
    ConstructorInfo[] constructs = type.GetConstructors();

    // 获得类型的字段信息
    FieldInfo[] fields = type.GetFields();
    Response.Write("<b>类的公共字段信息如下:</b>" + "<br/>");
    int a1 = 1;
    foreach (FieldInfo field in fields)
    {
        Response.Write((a1++).ToString() + ". " + field.Name + "<br/>");
    }

    // 获得方法信息
    MethodInfo[] methods = type.GetMethods();

    Response.Write("<b>类的公共方法如下:</b>" + "<br/>");
    int a2 = 1;
    foreach (MethodInfo method in methods)
    {
        ParameterInfo[] parameters = method.GetParameters();
        ParameterInfo reparam = method.ReturnParameter;
        Response.Write((a2++).ToString() + ". " + reparam.ParameterType.Name + " " + method.Name + "(");
        int index = 0;
        foreach (ParameterInfo para in parameters)
        {
            if (index++ < parameters.Length - 1)
                Response.Write(para.ParameterType.Name + " " + para.Name + ",");
            else
                Response.Write(para.ParameterType.Name + " " + para.Name);
        }
        Response.Write(")<br/>");
    }

    // 获得属性的信息
    PropertyInfo[] propertys = type.GetProperties();

    Response.Write("<b>类的公共属性如下:</b>" + "<br/>");
    int a3 = 1;
    foreach (PropertyInfo pro in propertys)
    {
        Response.Write((a3++).ToString() + ". " + pro.PropertyType.Name + " " + pro.Name + "{");
        if (pro.CanRead) Response.Write("get;");
        if (pro.CanWrite) Response.Write("set;");
        Response.Write("}<br/>");
    }
    // 获得事件信息
    EventInfo[] events = type.GetEvents();

    Response.Write("<b>类的成员如下:</b>" + "<br/>");
    // 获得成员
    int a4 = 1;
    foreach (MemberInfo mi in type.GetMembers())
    {
        Response.Write((a4++).ToString() + ". " + mi.MemberType.ToString() + " : " + mi.Name + "<br/>");
    }
}


六、动态创建对象

Assembly对象的 CreateInstance方法
Activator. CreateInstance方法
Type对象的 InvokeMember方法
// 使用Assembly的CreateInstance方法来取得对象的实例
private void Assembly_CreateInstance()
{
    string assemblyName = "SqlModel";
    string className = assemblyName + ".Member";
    // 创建无参数实例
    IDAL.IMember member = (IDAL.IMember)Assembly.Load(assemblyName).CreateInstance(className);
    Response.Write("创建无参数实例:" + member.ID + "<br/>");
    // 创建有参数实例
    Object[] parameters = new Object[1];
    parameters[0] = 10000;
    IDAL.IMember member1 = (IDAL.IMember)Assembly.Load(assemblyName).CreateInstance(className, false, BindingFlags.Default, null, parameters, null, null);
    Response.Write("创建有参数实例:" + member1.ID + "<br/>");
}


// 使用Activator的CreateInstance方法来取得对象的实例
private void Activator_CreateInstance()
{
    string assemblyName = "SqlModel";
    string className = assemblyName + ".Member";
    // 创建无参数实例
    System.Runtime.Remoting.ObjectHandle obj = Activator.CreateInstance(assemblyName, className);
    IDAL.IMember member = (IDAL.IMember)obj.Unwrap();
    Response.Write("创建无参数实例:" + member.ID + "<br/>");
    // 创建有参数实例
    Object[] parameters = new Object[1];
    parameters[0] = 10000;
    System.Runtime.Remoting.ObjectHandle obj1 = Activator.CreateInstance(assemblyName, className, false, BindingFlags.CreateInstance, null, parameters, null, null, null);
    IDAL.IMember member1 = (IDAL.IMember)obj1.Unwrap();
    Response.Write("创建有参数实例:" + member1.ID + "<br/>");
}

// 使用Type的InvokeMember方法来取得对象的实例
private void Type_InvokeMember()
{
    string assemblyName = "SqlModel";
    string className = assemblyName + ".Member";
    Assembly assem = Assembly.Load(assemblyName);
    Type type = assem.GetType(className);   // 註意这里如果使用Type.GetType来取得Type的话,那麼assemblyName指定的类一定要是强命名的
    // 创建无参数实例
    IDAL.IMember member = (IDAL.IMember)type.InvokeMember(className, BindingFlags.CreateInstance, null, null, null);
    Response.Write("创建无参数实例:" + member.ID + "<br/>");
    // 创建有参数实例
    Object[] parameters = new Object[1];
    parameters[0] = 10000;
    IDAL.IMember member1 = (IDAL.IMember)type.InvokeMember(className, BindingFlags.CreateInstance, null, null, parameters);
    Response.Write("创建有参数实例:" + member1.ID + "<br/>");
}


七、动态调用对象方法

Type对象的 InvokeMember方法
MethodInfo对象的Invoke方法
// Type对象的 InvokeMember方法来动态调用方法
private void InvokeMember()
{
    string assemblyName = "SqlModel";
    string className = assemblyName + ".Member";
    string methodName = String.Empty;
    string result = String.Empty;
    Assembly assem = Assembly.Load(assemblyName);
    Object obj = assem.CreateInstance(className);
    Type type = assem.GetType(className);   // 註意这里如果使用Type.GetType来取得Type的话,那麼assemblyName指定的类一定要是强命名的
    // 动态调用无参数的方法
    methodName = "GetName";
    result = (string)type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, obj, null);
    Response.Write(methodName + "方法的返回值:" + result + "<br/>");
    // 动态调用有参数的方法
    methodName = "Update";
    Object[] methodParams = new Object[1];
    methodParams[0] = DateTime.Now;
    result = (string)type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, obj, methodParams);
    Response.Write(methodName + "方法的返回值:" + result + "<br/>");
    // 动态调用参数构架函数的带有参数的方法
    Object[] parameters = new Object[1];
    parameters[0] = 10000;
    obj = assem.CreateInstance(className,false,BindingFlags.CreateInstance, null, parameters, null, null);
    result = (string)type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, obj, methodParams);
    Response.Write(methodName + "方法的返回值:" + result + "<br/>");
}


// MethodInfo对象的Invoke方法来动态调用方法

private void MethodInfo_Invoke()
{
    string assemblyName = "SqlModel";
    string className = assemblyName + ".Member";
    string methodName = String.Empty;
    string result = String.Empty;

    Assembly assem = Assembly.Load(assemblyName);
    Object obj = assem.CreateInstance(className);
    Type type = assem.GetType(className);   // 註意这里如果使用Type.GetType来取得Type的话,那麼assemblyName指定的类一定要是强命名的
    // 动态调用无参数的方法
    methodName = "GetName";
    MethodInfo methodInfo = type.GetMethod(methodName);
    result = (string)methodInfo.Invoke(obj, null);
    Response.Write(methodName + "方法的返回值:" + result + "<br/>");
    // 动态调用有参数的方法
    methodName = "Update";
    Object[] methodParams = new Object[1];
    methodParams[0] = DateTime.Now;
    MethodInfo method = type.GetMethod(methodName);
    result = (string)method.Invoke(obj, methodParams);
    Response.Write(methodName + "方法的返回值:" + result + "<br/>");
}


--------------------------------------------------------------------------------


以上所使用的SqlModel.Member為:
新建一个SqlModel类库,在其下建立一个Member的类

namespace SqlModel
{
    public class Member : IDAL.IMember
    {
        private int _id = 100;
        public int ID
        {
            get { return _id; }
            set { _id = value; }
        }
        private string _name = "limin";
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        public Member() { }
        public Member(int id)
        {
            _id = id;
        }

        private void Init()
        { }

        public string GetName()
        {
            return _name;
        }
        public string Update (DateTime cdate)
        {
            return "{" + String.Format("ID:{0},Name:{1},CreateDate:{2}",_id,_name,cdate) + "}";
        }
    }
}
分享到:
评论

相关推荐

    【ASP.NET编程知识】浅谈.NET反射机制的性能优化 附实例下载.docx

    【ASP.NET编程知识】浅谈.NET反射机制的性能优化 附实例下载.docx

    [ASP.NET.AJAX编程参考手册(涵盖ASP.NET.3.5及2.0)].(美)霍斯拉维.扫描版.pdf

    中文名: ASP.NET AJAX编程参考手册(涵盖ASP.NET 3.5及2.0) 原名: ASP.NET AJAX Programmer's Reference 作者: (美)霍斯拉维 译者: 刘志忠 图书分类: 软件 资源格式: PDF 版本: 扫描版 出版社: 清华大学出版社 书号...

    asp.net二进制反射机制

    学习反射,让我们了解.net内置函数的内幕!

    基于ASP.NET Web Application的插件动态编译反射实现

    项目中涉及到Asp.Net扩展性,考虑了两种扩展方法,一种是使用Web Services实现,另一种是动态生成代码然后利用反射来实现插件功能。现在网上博客什么的都是用插件的形式来扩展功能的,所以我也打算用插件来扩展asp...

    asp.net知识库

    利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL...

    中美 IT 培训 C# Asp.net 全套笔记1

    精通C#.Net、ASP.Net、ADO.Net、AJAX、WEB2.0、XML、JavaScript、SQL Server 2000、Web Service、WSE2.0、.Net Remoting、MultiThread Programming、Socket Programming、Windows Service、Data Structure、 ...

    中美 IT 培训 C# Asp.net 笔记3

    精通C#.Net、ASP.Net、ADO.Net、AJAX、WEB2.0、XML、JavaScript、SQL Server 2000、Web Service、WSE2.0、.Net Remoting、MultiThread Programming、Socket Programming、Windows Service、Data Structure、 ...

    庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术

    12.1 asp.net模板属性控件机制 463 12.1.1 模板属性介绍 463 12.1.2 asp.net对模板控件的支持 464 12.1.3 repeater控件模板实现机制解析 466 12.2 自定义控件应用示例 469 12.2.1 模板控件功能 469 12.2.2 ...

    中美 IT 培训 C# Asp.net 笔记2

    精通C#.Net、ASP.Net、ADO.Net、AJAX、WEB2.0、XML、JavaScript、SQL Server 2000、Web Service、WSE2.0、.Net Remoting、MultiThread Programming、Socket Programming、Windows Service、Data Structure、 ...

    ASP.NET 2.0+SQL Server 2005全程指南-源代码

    ASP.NET 2.0+SQL Server 2005全程指南 目录 基础篇 第1章 ASP.NET概述及环境配置 1.1 认识ASRNET 1.1.1 .NET Framework框架 1.1.2 ASP.NET功能与特性 1.1.3 ASP.NET与ASP的区别 1.2 搭建ASP.NET开发环境 1.2.1...

    asp.net 反射减少代码书写量

    代码如下:public bool Add(Liuyan refmodel) { string sql = “insert into liuyan(name,phone,zhiwei,gongsi,addr,country,dianyou,content,adddate)values(@name,@phone,@zhiwei,@gongsi,@addr,@country,@...

    庖丁解牛纵向切入ASP.NET 3.5控件和组件开发技术.pdf

    如果扎实地掌握了asp.net控件的运行机制,开发一个页面级的asp.net应用程序会变得非常简单。本书宗旨就是让开发人员真正理解asp.net技术,帮助开发人员提高asp.net开发的技术水平。学完本书后您不仅能够掌握控件开发...

    ASP.NET图书馆B/S系统

    系统基础代码应用了PetShop系统设计中的反射机制和抽象工厂方法模式,生成的基础类库包括Model对象实体类,封装操作数据库的类和函数的程序集DBUtility,数据访问层的接口程序集IDAL,访问SQL Server数据库,实现...

    asp.net面试题

    四、关于ASP.NET中的代码隐藏文件的描述正确的是( )。 A.Web窗体页的程序的逻辑由代码组成,这些代码的创建用于与窗体交互。该文件称作为“代码隐藏”文件,如果用C#创建,该文件将具有“.ascx.cs”扩展名 B.web...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part1

    12.1 asp.net模板属性控件机制 463 12.1.1 模板属性介绍 463 12.1.2 asp.net对模板控件的支持 464 12.1.3 repeater控件模板实现机制解析 466 12.2 自定义控件应用示例 469 12.2.1 模板控件功能 469 12.2.2 ...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part2

    12.1 asp.net模板属性控件机制 463 12.1.1 模板属性介绍 463 12.1.2 asp.net对模板控件的支持 464 12.1.3 repeater控件模板实现机制解析 466 12.2 自定义控件应用示例 469 12.2.1 模板控件功能 469 12.2.2 ...

    利用反射机制动态获取对象属性名称及数据类型

    利用反射机制动态获取对象属性名称及数据类型 利用反射机制动态获取对象属性名称及数据类型 利用反射机制动态获取对象属性名称及数据类型 利用反射机制动态获取对象属性名称及数据类型 利用反射机制动态获取对象属性...

    asp.net 辅助发开系统

    系统生成的代码基于面向对象的思想和三层架构设计,简而易懂,结合了Petshop中经典的思想和设计模式,融入了工厂模式,反射机制等等一些思想。主要实现在对应数据库中表的基类代码的自动生成,包括生成属性、添加、...

    asp.net AJAX注册类

    就是将wallis加入window中,然后就可以直接在任何地方使用该命名空间(window是全局的,而且使用时可以省略) 2、注册类 wallis.Animal.registerClass(“wallis.Animal”); 在MicrosoftAjax.js中可以找到 Type....

    ASP.NET Eval进行数据绑定的方法

    假设你已经了解ASP.NET Eval 1.1的数据绑定(特别是Container这个局部变量)的机制,这里主要分析ASP.NET Eval 2.0数据绑定做了那些改进. ASP.NET Eval 2.0 的数据绑定函数Eval&#40;&#41;简化掉了ASP.NET Eval 1.1神秘...

Global site tag (gtag.js) - Google Analytics