`
micc010
  • 浏览: 71582 次
  • 性别: 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反射超强实现, js反射

    本文将深入探讨反射的概念,以及如何在ASP.NET环境中运用反射,并对比分析C#和JavaScript中的反射机制。 首先,我们要理解什么是反射。反射是编程语言提供的一种能力,它允许运行中的程序检查自身并操作其内部结构...

    .net中的反射,asp.net反射

    在ASP.NET中,反射的运用尤为关键,因为它可以实现动态类型加载、对象实例化、调用方法以及访问属性等功能。本文将深入探讨.NET中的反射以及它在ASP.NET中的应用。 一、什么是反射? 反射是.NET框架提供的一种机制...

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

    本文将深入探讨.NET反射机制的性能优化策略,并通过比较不同调用方式的性能,给出实际的优化建议。 首先,我们要理解反射的工作原理。反射允许程序在运行时获取类型信息并执行相关的操作,如创建对象、调用方法、...

    asp.net二进制反射机制

    本文将深入探讨ASP.NET中的二进制反射机制,揭示.NET内置函数背后的秘密。 首先,理解反射的基本概念是至关重要的。反射允许代码分析自身,即在运行时获取关于类、结构、接口、方法、属性等的所有信息。在.NET中,`...

    .net 插件机制的实现

    在插件机制中,每个插件通常是一个独立的程序集,可以通过反射API(如Assembly.Load或Assembly.LoadFrom)在运行时加载。 实现.NET插件机制的关键步骤如下: 1. **接口定义**:为了确保插件与主应用程序之间的交互...

    asp.net反射简单应用实例

    以下是关于***反射机制的一些详细知识点: ### 反射的原理 反射是.NET框架提供的一个特性,它通过System.Reflection命名空间下的类和方法来实现。反射机制让程序能够查询和操作类型的信息,以及创建和操作类型实例...

    【ASP.NET编程知识】asp.net利用反射实现给model类赋值的方法.docx

    在 ASP.NET 编程中,使用反射机制可以实现各种数据访问和业务逻辑处理,例如,使用反射机制可以实现给 Model 类赋值、实现数据绑定、实现业务逻辑处理等等。 使用反射机制实现给 Model 类赋值的方法是一种常见的...

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

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

    【ASP.NET编程知识】ASP.NET中实现Form表单字段值自动填充到操作模型中.docx

    在ASP.NET中,我们可以使用反射机制来实现Form表单字段值自动填充到操作模型中。反射机制是一种Powerful的机制,它允许我们在运行时动态地访问和操作类型的成员。 首先,我们需要定义一个基类,该基类将负责将Form...

    asp.net三层架构简单示例

    `C__反射中Assembly[1].Load及Assembly.Load.CreateInstance.doc`文档可能详细解释了如何利用.NET反射API来动态加载程序集和实例化类。 8. **数据库连接(DB_51aspx)** - 可能包含了数据库相关的配置文件或数据库...

    Asp.net面试题大全(有答案)

    【Asp.net面试题大全(有答案)】 Asp.net技术是Microsoft开发的一种Web应用程序框架,主要用于构建动态网站、Web应用程序和服务。以下是一些Asp.net面试中的常见问题及其答案,帮助.net程序员准备面试。 1. ...

    【ASP.NET编程知识】.NET获取枚举DescriptionAttribute描述信息性能改进的多种方法.docx

    在 ASP.NET 编程中,获取枚举 DescriptionAttribute 描述信息是一个常见的需求。DescriptionAttribute 特性可以用于 many places,例如枚举,通过获取枚举上定义的描述信息在 UI 上显示。本文将讨论获取枚举描述信息...

    【ASP.NET编程知识】未能加载文件或程序集“AspNetPager”或它的某一个依赖项 拒绝访问.docx

    * 使用 ASP.NET 的反射机制来调用 C# 类中的方法 * 使用 C# 类的实例来调用方法 七、SQL Server 中调用 .NET 程序集中的方法 在 SQL Server 开发中,我们经常需要调用 .NET 程序集中的方法。这可以使用 SQL Server...

    .net中反射和序列化示例

    - 传递数据到客户端:Web API或ASP.NET MVC应用中,将对象序列化为JSON或XML,作为HTTP响应返回给客户端。 - 保存配置:将复杂配置对象序列化,便于持久化和加载。 在“反射”文件中,可能包含如何使用反射创建和...

    通过反射实现不同页面的返回

    在这种情况下,反射机制可以派上用场。反射是Java语言提供的一种强大的功能,允许程序在运行时动态地获取类的信息(如类名、方法名)并调用它们。 标题"通过反射实现不同页面的返回"主要涉及到以下知识点: 1. **...

    Asp.net Mvc简易插件系统示例

    Asp.NET MVC(Model-View-Controller)框架是微软提供的一种用于构建动态网站的应用程序开发模型,它结合了强类型、测试驱动的开发方法和Web应用程序的灵活性。在这个"简易插件系统示例"中,我们将探讨如何在Asp.NET...

    C#和ASP.Net面试题目集锦

    在.NET框架中,C#和ASP.NET是两个关键的技术领域,广泛应用于开发高效、功能丰富的Web应用程序。这个压缩包文件“C#和ASP.Net面试题目集锦.doc”显然是为准备.NET开发者面试的人提供的资源,涵盖了C#语言的基础与...

    ASP.NET与c#终极资料

    4. **Postback机制**:ASP.NET的Postback机制使得用户操作后无需重新加载整个页面,提高了用户体验。 5. **MVC(Model-View-Controller)框架**:ASP.NET MVC提供了一种分离关注点的开发模式,增强了代码的可测试性...

    ASP.NET.AJAX.Programmers.Reference.with.ASP.NET.2.0.or.ASP.NET.3.5

    - **介绍**: 介绍了ASP.NET AJAX中客户端与服务器端之间的通信机制。 - **知识点**: - XMLHttpRequest对象的使用。 - AJAX请求的发送与响应处理。 - JSON数据格式的应用。 ##### 13. 通过SOAP消息消费Web服务 - ...

Global site tag (gtag.js) - Google Analytics