反射的定义:审查元数据并收集关於它的类型信息的能力,元数据(编辑后的基本数据单元)就是一大堆表,编译器会创建一个类定义表,一个字段定义表,一个方法定义表等,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) + "}";
        }
    }
}

C#反射机制详解的更多相关文章

  1. Java 反射机制详解(下)

    续:Java 反射机制详解(上) 三.怎么使用反射 想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属 ...

  2. Java 反射机制详解(上)

    一.什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...

  3. Java反射机制详解

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反 ...

  4. Java中反射机制详解

    序言 在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射, ...

  5. java反射机制详解 及 Method.invoke解释

    JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为ja ...

  6. Java 反射机制详解

    动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如众所周知的ECMAScript(JavaScript)便是一个动态语言.除此之外如Ru ...

  7. Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring

    IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更 ...

  8. Java反射机制详解(1) -反射定义

    首先,我们在开始前提出一个问题: 1.在运行时,对于一个java类,能否知道属性和方法:能否去调用它的任意方法? 答案是肯定的. 本节所有目录如下: 什么是JAVA的反射机制 JDK中提供的Refle ...

  9. [转]Java反射机制详解

    目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ·获取一个对象的父类与实现的接口 ·获取某个类中的全部构造函数 - 详 ...

  10. Java_反射机制详解

    本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案例1]通过一个对象 ...

随机推荐

  1. eclipse安装、汉化、搭建安卓开发环境

    1.eclipse与jdk的位数(32bit or 64bit )要对应,否则会提示Failed to load JNI shared library.提示这一种错误据说还有另外一种原因就是Path路 ...

  2. 使用 keepalived 设置虚拟 IP 环境(转载)

    使用 keepalived 设置虚拟 IP 环境 原文地址:https://blog.csdn.net/kongxx/article/details/73173762 使用 keepalived 设置 ...

  3. centos7 真实机安装后没有网卡解决办法

    我们在真实机安装完centos7版本后,会发现没有网卡,只有lo口 因为真实机不同你在虚拟机里面,这个时候我们不能连网,更加不要说配置什么静态ip了 是什么原因呢,是因为有些真实机安装了centos系 ...

  4. mysql 取整数或小数或精确位数

    select cast(3.1415926 as decimal(9,2))精确到几位 select round(1024.5); 四舍五入 select floor(1024.5);取整数部分 se ...

  5. JQuery加载列表实现动画滚动(自上而下挤)

    这个例子是jquery动态加载列表,并通过定时刷新,实现其循环滚动效果的一个例子. 1.HTML代码: <div class="fake-table"> <li ...

  6. Spring boot 下使用 Swagger

    通过Swagger 可以更好的将后台的RESTfull API文档化,如下图所示: 1. Swagger 主要依赖以下两个jar包: <!-- https://mvnrepository.com ...

  7. fiddler--配置火狐代理配置代理

    fiddler安装 下载fiddler最新版: 默认安装: 配置火狐代理配置代理 打开fiddler 按图操作,复制选中的链接:fiddler -> tool ->connections ...

  8. vue-demo

    github地址:  https://github.com/TingtingYin/vue-demo

  9. Python并发编程一(多进程)

    1.背景知识(进程.多道技术) 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一 ...

  10. 了解一下,Java 虚拟机

    1.1 - 概述     Java 总述:Java 不仅是一门编程语言,还是一个由一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于 嵌入式 ...