HttpContext的dynamic包装器DynamicHttpContext (附原代码)

项目背景:在.net framework下使用asp.net webform,特别是aspx+ajax+ashx中,ashx后台代码获取传入参数的时候,需要很多[“…”],我用dynamic对他进行包装。

废话不多说,上代码(文章最下面有上传打包代码):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace MyWebDemo
{
    public partial class UserList : System.Web.UI.Page
    {
        /// <summary>
        /// [email protected] qq:38798579
        /// http://www.cnblogs.com/stevenchennet
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            //
            // 这是以前的做法,这些["parameter"]很费劲
            //
            //HttpContext context = HttpContext.Current;
            //if (!this.IsPostBack)
            //{
            //    // http://localhost:20000/UserList.aspx?id=1&name=StevenChennet
            //    int id = int.Parse(context.Request.Params["id"]);
            //                //    string name = context.Request.Params["nAMe"];

            //    this.lbl.InnerText = string.Format("Get提交 id:{0} name:{1}", id, name);
            //}
            //else
            //{
            //    // form post
            //    int age = int.Parse(context.Request.Form["age"]);
            //    string address = context.Request.Form["AddRESS"];

            //    this.lbl.InnerText = string.Format("Post提交 age:{0} address:{1}", age, address);
            //}

            dynamic dContext = new DynamicHttpContext(HttpContext.Current);

            if (!this.IsPostBack)
            {
                // http://localhost:20000/UserList.aspx?id=1&name=StevenChennet
                int id = dContext.id;
                // nAMe也可以用Name,忽略大小写的,这里故意写成nAMe意思是忽略大小写。                string name = dContext.nAMe;

                this.lbl.InnerText = string.Format("Get提交 id:{0} name:{1}", id, name);
            }
            else
            {
                // form post
                int age = dContext.Age;
                string address = dContext.AddRESS;

                this.lbl.InnerText = string.Format("Post提交 age:{0} address:{1}", age, address);
            }

        }
    }
}

下面是实现的代码

using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Web;

namespace System.Web
{
    /// <summary>
    /// [email protected] qq:38798579
    /// http://www.cnblogs.com/stevenchennet
    /// </summary>
    public class DynamicHttpContext : DynamicObject
    {
        private string keyContent;
        private HttpContext httpContext;

        public DynamicHttpContext(HttpContext context)
        {
            this.httpContext = context;
        }

        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            string key = binder.Name;

            if (httpContext.Request.HttpMethod == "GET")
            {
                this.keyContent = this.httpContext.Request.QueryString.Get(key);
            }
            else
            {
                this.keyContent = this.httpContext.Request.Form.Get(key);
            }

            result = this;
            return true;
        }

        public override bool TryConvert(ConvertBinder binder, out object result)
        {
            result = null;
            Type binderType = binder.Type;

            //int
            if (binderType == typeof(int))
            {
                result = int.Parse(this.keyContent);
            }
            else if (binderType == typeof(int?))
            {
                if (string.IsNullOrWhiteSpace(this.keyContent))
                {
                    result = int.Parse(this.keyContent);
                }
                else
                {
                    result = default(int?);
                }
            }
            // bool
            else if (binderType == typeof(bool))
            {
                result = bool.Parse(this.keyContent);
            }
            else if (binderType == typeof(bool?))
            {
                if (string.IsNullOrWhiteSpace(this.keyContent))
                {
                    result = bool.Parse(this.keyContent);
                }
                else
                {
                    result = default(bool?);
                }
            }
            // datetime
            else if (binderType == typeof(DateTime))
            {
                result = DateTime.Parse(this.keyContent);
            }
            else if (binderType == typeof(DateTime?))
            {
                if (string.IsNullOrWhiteSpace(this.keyContent))
                {
                    result = DateTime.Parse(this.keyContent);
                }
                else
                {
                    result = default(DateTime?);
                }
            }
            // string
            else if (binderType == typeof(string))
            {
                result = this.keyContent;
            }
            else
            {
                throw new NotSupportedException(string.Format("类型 {0} 还未实现,请添加转换代码", binderType.ToString()));
            }
            return true;
        }
    }
}
 

-----------------------利益相关:.net软狗一枚,济南工作,qq:38798579,欢迎同道朋友骚扰。----------------------

代码打包下载(VS2013)

http://files.cnblogs.com/StevenChennet/AppDomainPerformanceDemo.zip

时间: 2024-11-12 19:44:30

HttpContext的dynamic包装器DynamicHttpContext (附原代码)的相关文章

Fms3和Flex打造在线多人视频会议和视频聊天(附原代码)

Flex,Fms3系列文章导航 Flex,Fms3相关文章索引 本篇是视频聊天,会议开发实例系列文章的第3篇,该系列所有文章链接如下: http://www.cnblogs.com/aierong/archive/2008/12/30/Flex.html#sp 1.工作原理NetStream.publish方法的应用publish () 方法:将音频流.视频流和文本消息流从客户端发送到 Flash Media Server,并可选择在传输期间录制该流. 此方法仅供指定的流的发布者使用.第1个参数

对象包装器与自动装箱

前言 前面提到过,除了int,float这些基本数据类型,其他所有数据类型在Java中都是类. 那么,如果我希望这些基本类型也是类类型呢? 那么就使用对象包装器吧. 包装器的作用 1. 它能够提供很多类型转型方面的方法. 2. 泛型数据的成员只能是对象. 自动装箱 就是当你使用某个基础类型,但实际类型要求是它的包装器的时候,编译器不会报错,会帮你自动完成转型. 如: ArrayList <Integer> array = new ArrayList <> (): array.add

【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器

类模板 类模板多个类型默认类型简单数组模板 #pragma once template <class T=int>//类模板可以有一个默认的值 class myArray { public: myArray(); ~myArray(); }; #include "myArray.h" template <class T=int>//每一个函数都需要加上一个默认的值 myArray<T>::myArray() //类模板成员函数在外部,需要加载类型初始

java基本类型和包装器类

java是一种面向对象语言,java中的类把方法与数据连接在一起,并构成了自包含式的处理单元.但在java中不能定义基本类型(primitive type),为了能将基本类型视为对象来处理,并能连接相关的方法,java为每个基本类型都提供了包装类,这样,我们便可以把这些基本类型转化为对象来处理了.这些包装类有:Boolean,Byte,Short,Character,Integer,Long,Float,Double,Void共9个(注意:Date不是,无其基本类型). 一. 包装类(Wrapp

函数包装器

在看express的源码中,经常看到函数包装的写法,有点难理解,函数包装器的作为是对一个函数进行包装,返回另外一个函数. 在包装的过程中,对旧函数和传递的参数进行改造加工.一般模式是: // oldF 旧函数, newF 新函数,callback回调函数 options 参数 newF = function(oldF,callback, options) { return function(){ // 在调用newF是,获取newF的参数 var args = Array.prototype.s

(九)对象包装器与自动装箱

有时候需要将基本数据类型转换为对象,如int -> Integer.Integer这样的类称为对象包装器类,该类一旦构造对象,便是不可变的. 装箱 list.add(3) 自动变为 list.add(Integer.valueOf(3)) 拆箱 int n = list.get(i) 自动变为 int n = list.get(i).intValue() 注意:Integer对象是不可变的,包含在包装器的内容不会改变.不能使用包装器类创建修改数值参数的方法.比如: Integer n = Int

包装器的使用

对于不存在Gradle环境的开发者来说,要使用包装器 添加这样一个task //包装器 task wrapper(type:Wrapper){ gradleVersion='2.13' } 然后执行  gradle -q wrapper 会生成一个用于Unix和Windows的脚本,然后这个脚本名就可以当做gradle命令一样进行使用. 首次运行的时候,会从网上下载指定版本的gradle,以后就会用这个gradle作为运行时环境进行执行 如果不能上网怎么办? //包装器 task wrapper

C++函数包装器

函数包装器把函数包装起来:有以下特点 1.设计通用的函数执行接口,可以设置计数(函数执行次数)和关卡 2.函数包装器依赖于函数模板,实现通用泛型 3.函数代码可以内嵌在函数中 4.原理是函数指针实现的 以下给出C++简单的函数包装器案例 #include<iostream> #include<functional> using std::cout; using std::endl; using std::cin; using std::function; //定义好了一个函数包装器

《Head First Servlets & JSP》-13-过滤器和包装器

过滤器是什么 与servlet非常类似,过滤器就是java组件,请求发送到servlet之前,可以用过滤器截获和处理清求,另外 servlet结束工作之后,在响应发回给客户之前,可以用过滤器处理响应. 容器根据DD中的声明来确定何时调用过滤器.在DD中,部署人员要建映射.明确对于哪个请求URL模式要调用哪些过滤器.所以,要由部署人员(而不是程序员)来确定哪些请求或响应应当由哪些过滤器处理. 过滤器要做的事情 只有一个过滤器接口:Filter,根据使用方式,可完成诸如以下工作: 请求过滤器可以完成