using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Reflection; namespace ReligionServer.util{ /// <summary>
/// 反射工具类
/// </summary>
public class ReflectionUtil{ public static void MyInvoke(HttpContext context, Type type, String methodName) {
try {
//BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance;
BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic;
MethodInfo method = type.GetMethod(methodName, bindingFlags);//反射获取公有和私有方法 默认获取公有方法 method.Invoke(Activator.CreateInstance(type, true), bindingFlags, Type.DefaultBinder, new object[] { context }, null);
} catch (FormatException e) {
handler.BaseHandler.Error<String>(context, new List<string>() { e.Message });
} catch (TargetInvocationException e) {
//handler.BaseHandler.Error<String>(context, new List<string>() { e.Message });
} catch (Exception e) {
//handler.BaseHandler.Error<String>(context, new List<string>() { e.Message });
}
} /// <summary>
/// 如果传递的type具有泛型形参, 那么返回泛型形参对象的实例, 否则返回当前type的实例
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public static Object Instance(Type type) {
Type paramType = type.GetGenericArguments()[];
type = paramType == null ? type : paramType;
return Activator.CreateInstance(type, true);
} /// <summary>
/// 获取所有方法(公有方法和私有方法)
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public static MethodInfo[] GetMethods(Type type) {
BindingFlags bindingFlags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic;
return type.GetMethods(bindingFlags);
} /// <summary>
/// 获取包括父类(但是除开Object)的所有字段
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public static List<FieldInfo> GetFileldS(Type type) {
List<FieldInfo> list = new List<FieldInfo>();
list.AddRange(type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static));
while ((type = type.BaseType) != typeof(Object)) {
list.AddRange(type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static));
}
return list;
} }
}
//调用反射执行方法
protected void InitAction(HttpContext context) {
String action = context.Request.Params["action"];
if (action != null && action != "") {
ReflectionUtil.MyInvoke(context, this.GetType(), action);
} else {
context.Response.ContentType = "text/plain";
context.Response.Write("Action 参数不能为空...");
}
}

//这个是我在使用ashx处理程序的时候写的,一个ashx(一般处理程序)对应一个请求,我觉得一个请求一个文件不够优雅,所以就使用反射结合上传参数action(action:methodname)进行方法调用,以此来实现一个文件一个模块可多个请求的情况

Framework版本:.Net Framework 4

C#反射——简单反射操作类的封装的更多相关文章

  1. Java面向对象(类、封装)

    面向对象 今日内容介绍 u 面向对象 u 封装 第1章 面向对象 1.1 理解什么是面向过程.面向对象 面向过程与面向对象都是我们编程中,编写程序的一种思维方式. l 面向过程的程序设计方式,是遇到一 ...

  2. java---解析XML文件,通过反射动态将XML内容封装到一个类中

    本博客讲的XML解析,使用的是dom4j. 首先建立一个maven项目,在dom.xml中引入相应的dom4j的版本.作者下载的是热度很高的1.6.1版本.maven的使用在这里不做详细讲解. 引入成 ...

  3. 进阶Java编程(10)反射与简单Java类

    1,传统属性自动赋值弊端 简单Java类主要由属性构成,并且提供有setter与getter类,同时简单Java类最大的特征就是通过对象保存相应的类属性的内容.但是如果使用传统的简单Java类开发,那 ...

  4. java反射(四)--反射与简单java类

    一.传统简单java类 简单的java类主要是由属性所组成,并且提供有相应的setter以及getter的处理方法,同时简单java类最大的特征就是通过对象保存相应的类的属性内容,但是如果使用传统的简 ...

  5. java--分析简单java类与反射的联系

    分析简单java类与反射的联系 web对反射的操作支持 在JSP之中有一种技术--javaBean.而且在jsp里面也配套有相应的操作方式,javaBean的核心在于简单java类,于是下面演示此操作 ...

  6. c++的类的封装/继承/多态的简单介绍

    本篇文章仅仅从很表层来介绍一个C++语言中的类,包括什么是类,类的封装性/继承性和多态性.高手直接跳过吧,看了浪费时间,新手或者想温习一下的可以浏览看看. 1. 什么是类? 到底什么是类(class) ...

  7. Java反射+简单工厂模式总结

    除了 new 之外的创建对象的方法 通过 new 创建对象,会使得程序面向实现编程,先举个例子,某个果园里现在有两种水果,一种是苹果,一种是香蕉,有客户想采摘园子里的水果,要求用get()方法表示即可 ...

  8. Java反射初探 ——“当类也学会照镜子”

    反射的作用 开门见山地说说反射的作用   1.为我们提供了全面的分析类信息的能力 2.动态加载类   我理解的“反射”的意义 (仅个人理解哈)   我理解的java反射机制就是: 提供一套完善而强大的 ...

  9. Java反射简单使用--第一次细致阅读底层代码

    1:所写的东西都经过验证,保证正确,环境jdk8,eclipse2:在例子中,尽量以生产环境中实际代码为例,那种固定值什么的没什么意义 问题: 1:想获取调用方法所需要的参数 2:参数是以json形式 ...

随机推荐

  1. HttpPost导包遇到的问题

    直接在当前项目 build.gradle文件修改如下 android { useLibrary 'org.apache.http.legacy' compileSdkVersion 24 buildT ...

  2. memset和memcpy函数、atoi函数

    memset void *memset(void *s,int c,size_t n) 总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c.如下: // 1.将已开辟内存空间s的首n个字节 ...

  3. openstack将本地实例迁移至ceph存储中

    需求: 最近在openstack上线了ceph存储,创建虚拟机和云硬盘都基于ceph卷进行存储和创建,但是之前openstack用的是本地存储,创建的所有实例都在本地文件中,当实例重启之后,opens ...

  4. poj3744 Scout YYF I[概率dp+矩阵优化]

    Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8598   Accepted: 2521 Descr ...

  5. Egret P2 入门学习资料

    1 p2库下载: https://github.com/egret-labs/egret-game-library/tree/rc/4.1.0 2 p2 作者demo:https://github.c ...

  6. 服务器报错 500,请确保 ASP.NET State Service(ASP.NET 状态服务)已启动

    报错信息: 解决方案: 开启此服务

  7. 宝塔面板快速开启https服务

    最近在做小程序开发,急需要一个https的域名,首先我的域名是阿里云的,服务器是腾讯云的,操作都一样: 无论阿里云还是腾讯云,配置SSL是针对服务器的,所以首先是要去申请 腾讯/阿里云服务器的SSL( ...

  8. 【node】------mongoose的基本使用------【巷子】

    1.安装mongoose npm install mongoose 2.启动数据库 mongod --dbpath d:\data\db 3.引入mongoose模块并连接数据库 const mong ...

  9. 清空messages方法

    1.du -sh /var/log/messages 2.losf /var/log/messages 3.cat /dev/null > /var/log/messages 4.du -sh ...

  10. Magento 2 初探

    进入公司有一小段时间了,虽然自己之前一直从事前端工作,但是基本工作就是做一些国内电商网站的前端工作.在刚进入这家公司时,自己对 magento2 一无所知,尽管上班前看过老大发给我的一些文档资料,但是 ...