自动匹配HTTP请求中对应实体参数名的数据(性能不是最优)

        /// <summary>
        /// 获取请求参数字段
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static T GetRequestParas<T>()
        {

            T t = (T)Activator.CreateInstance(typeof(T));
            if (HttpContext.Current == null)
            {
                return t;
            }
            if (HttpContext.Current.Request.Form.Count < 0 && HttpContext.Current.Request.QueryString.Count < 0)
            {
                return t;
            }
            //获取所有为Public的字段和实例成员(如果有的话)
            PropertyInfo[] props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
            //遍历每一个字段
            foreach (PropertyInfo p in props)
            {
                var value = HttpContext.Current.Request[p.Name.ToLower()];

                if (value != null)
                {

                    var okvalue = ConvertTo(value, p.PropertyType);
                    if (okvalue == null)
                    {
                        okvalue = ConverUtil.toObject(value);
                    }

                    p.SetValue(t, okvalue, null);
                }

            }
            return t;
        }

        /// <summary>
        /// 转换方法
        /// </summary>
        /// <param name="convertibleValue">待转换内容</param>
        /// <param name="t">新的类型</param>
        /// <returns>转换后的内容,如果转换不成功,返回null</returns>
        public static object ConvertTo( IConvertible convertibleValue,Type t)
        {
            if (null == convertibleValue)
            {
                return null;
            }
            if (!t.IsGenericType)
            {
                return Convert.ChangeType(convertibleValue, t);
            }
            else
            {
                Type genericTypeDefinition = t.GetGenericTypeDefinition();
                if (genericTypeDefinition == typeof(Nullable<>))
                {
                    return ConverValue(convertibleValue.toString(), Nullable.GetUnderlyingType(t));
                    // Convert.ChangeType(convertibleValue, Nullable.GetUnderlyingType(t));
                }
            }
            return null;
        } 

        /// <summary>
        /// 执行TryParse方法进行转换
        /// </summary>
        /// <param name="value">待转换内容</param>
        /// <param name="type">新的类型</param>
        /// <returns>转换后的内容,如果转换不成功,返回null</returns>
        public static object ConverValue(string value, Type type)
        {
            Object testValue = Activator.CreateInstance(type);

            object[] invokeArgs = new object[] { value, testValue };
            Type[] types = new Type[2];
            types[0] = typeof(string);
            types[1] = type.MakeByRefType();
            var isok = RunMethod("TryParse", types, invokeArgs, type);
            bool outok = false;
            bool.TryParse(isok.toString(), out outok);
            if (outok)
            {
                return invokeArgs[1];
            }
            return null;
        }

        /// <summary>
        /// 执行反射的方法
        /// </summary>
        /// <param name="methodName">方法名</param>
        /// <param name="types">参数类型</param>
        /// <param name="invokeArgs">参数值</param>
        /// <param name="invokeArgs">方法所在类的类型</param>
        /// <returns></returns>
        public static object RunMethod(string methodName, Type[] types, object[] invokeArgs, Type type)
        {
            Object Value = Activator.CreateInstance(type);

            MethodInfo mi = type.GetMethod(methodName, types);
            if (mi == null)
            {
                return null;
            }
            Object returnValue = mi.Invoke(Value, invokeArgs);
            return returnValue;
        }

  写了大半天才写好,累死了。

方法的作用是自动匹配HTTP请求中对应实体参数名的数据,就是这样,其它的方法也可以单独用的,不过单独用的话最好写成扩展方法,直接点出来。

时间: 2024-08-28 01:36:28

自动匹配HTTP请求中对应实体参数名的数据(性能不是最优)的相关文章

正则表达式匹配SQL语句中的所有表名

折磨了几个小时,写出匹配SQL语句中的所有表名,备忘记录 1 \*\s+from\s+[\w\[\]]*\.?[\w\[\]]*\.?\[?(\b\w+)\]?[\r\n\s]* 支持各种表达式 SELECT * FROM Config SELECT * FROM [dbo].IMEIUser SELECT * FROM dbo.LotteryLog SELECT * FROM [GreenPrize]SELECT * FROM [dbo].[Config]SELECT * FROM dbo.[

Web容器自动对HTTP请求中参数进行URLDecode处理

如题,在Java中也许很多人都没有注意到当我们发送一个http请求给时,如果附带的参数被URLEncode之后,到达web容器之后,开发者获取到的参数值会自动变成了encode之前的值.这是一个很好的特点,开发者完全可以忽略http的参数是否需要decode这种事,但是decode到底是在什么发生的呢? 一时兴起就陷了进去,于是就开始一层层的找起了. 第一步就是从request.getParameter()方法下手,但是ServletRequest只是一个接口,是J2EE定义的Servlet框架

ajax请求中传递的参数中如果含有特殊字符怎么处理?

在JQUERY AJAX开发中遇到了下面的一个问题,在执行AJAX请求的时候,需要传递一个“50%”的参数,而这个参数中含有特殊字符%.这样的话就会出现问题了,我们知道服务器在发送请求的时候,会将url中的参数转化成类似于“%2C%2F%3F%3A%40%26%3D%2B%24%23”,所以在我们执行含有这样特殊字符的ajax请求的时候就会出现错误,因为我们传递的参数可能发生了变化,也可能由于参数本身中就含有特殊字符所以系统没有办法编译它. 可能会抛出这样的一个异常: 警告: Parameter

js http 请求 多个相同参数名传值

最近在用js和api做对接的时候需要传参数类似于 rights=a1&rights=a2 因为有相同的参数名,试过很多方法都被覆盖了. 最后终于发现可以通过rights[a1,a2]的方式,浏览器会自动转换成上门的&连接格式. 谨在此记录.

Jquery中Ajax异步请求中的async参数的作用

之前不知道这个参数的作用,上网找了前辈的博客,在此收录到自己的博客,希望能帮到更多的朋友: test.html <a href="javascript:void(0)" onmouseover="testAsync()"> asy.js function testAsync{ var temp;     $.ajax({         async: false,         type : "GET",         url :

spring boot拦截器中获取request post请求中的参数

最近有一个需要从拦截器中获取post请求的参数的需求,这里记录一下处理过程中出现的问题. 首先想到的就是request.getParameter(String )方法,但是这个方法只能在get请求中取到参数,post是不行的,后来想到了使用流的方式,调用request.getInputStream()获取流,然后从流中读取参数,如下代码所示: String body = ""; StringBuilder stringBuilder = new StringBuilder(); Buf

python函数中的关键字参数

关键字参数: 就是在形式参数中必须要提供”传递参数名=传递参数值” 位置参数:  仅仅只有参数名 特点:1.位置参数只能出现在关键字参数之前,不管是在行参还是实参中. 2.关键字参数在调用时(实参)中不必按照形参中的顺序来,只要传递参数名=传递参数值即可. 3.在实参中可以用“参数名=参数值”调用位置参数,但必须遵守第一条. def testTwo(x, y, z=1): print(x, y, z) if __name__=='__main__': testTwo( 1,y=2,z=3) te

ASP.NET MVC3中Controller与View之间的数据传递总结

</pre>在ASP.NET MVC<span style="font-family:宋体">中,经常会在</span>Controller<span style="font-family:宋体">与</span>View<span style="font-family:宋体">之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨:&

ASP.NET MVC3中Controller与View之间的数据传递

在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一.  Controller向View传递数据 1.       使用ViewData传递数据 我们在Controller中定义如下: [csharp] view plain copy print? ViewData["Message_ViewData"] = " Hello ViewData!"; Vi