将Object转换成Dictionary方法

如果Object是Dictionary类型,直接返回

如果Object是NameValueCollection类型,则添加到Dictionary里

如果Object是Hashtable类型,添加到Dictionary里

...其他键值类型请自己完善

如果Object非上述类型,则用IL语言将其转换成Dictionary类型,

具体代码如下:

  public static Dictionary<string, object> ConvertFromObject(object obj)
        {
            if (obj is Dictionary<string, object>)
                return (Dictionary<string, object>)obj;

            var nvc = obj as NameValueCollection;
            if (nvc != null)
            {
                Dictionary<string, object> dict = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
                foreach (string key in nvc.Keys)
                    dict.Add( key, nvc[key]);
                return dict;
            }

            var hs = obj as Hashtable;
            if (hs != null)
            {
                Dictionary<string, object> dict = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
                foreach (string key in hs.Keys.OfType<string>())
                    dict.Add(key, hs[key]);
                return dict;
            }var type = obj.GetType();
            lock (dictionaryCache)
            {
                Func<object, Dictionary<string, object>> getter;
                if (dictionaryCache.TryGetValue(type, out getter) == false)
                {
                    getter = CreateDictionaryGenerator(type);
                    dictionaryCache[type] = getter;
                }
                var dict = getter(obj);
                return dict;
            }
        }
        private static Func<object, Dictionary<string, object>> CreateDictionaryGenerator(Type type)
        {
            var dm = new DynamicMethod((string.Format("Dictionary{0}", Guid.NewGuid())), typeof(Dictionary<string, object>), new[] { typeof(object) }, type, true);
            ILGenerator il = dm.GetILGenerator();
            il.DeclareLocal(typeof(Dictionary<string, object>));
            il.Emit(OpCodes.Nop);
            //Dictionary<string, object> dic = new Dictionary<string, object>();
            il.Emit(OpCodes.Newobj, typeof(Dictionary<string, object>).GetConstructor(Type.EmptyTypes));
            il.Emit(OpCodes.Stloc_0);

            foreach (var item in type.GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                string columnName = item.Name;
                il.Emit(OpCodes.Nop);
                il.Emit(OpCodes.Ldloc_0);
                il.Emit(OpCodes.Ldstr, columnName);
                il.Emit(OpCodes.Ldarg_0);
                il.Emit(OpCodes.Callvirt, item.GetGetMethod());
                if (item.PropertyType.IsValueType)
                {
                    il.Emit(OpCodes.Box, item.PropertyType);
                }
                il.Emit(OpCodes.Callvirt, typeof(Dictionary<string, object>).GetMethod("Add"));
            }
            il.Emit(OpCodes.Nop);

            il.Emit(OpCodes.Ldloc_0);
            il.Emit(OpCodes.Ret);
            var func = (Func<object, Dictionary<string, object>>)dm.CreateDelegate(typeof(Func<object, Dictionary<string, object>>));
            return func;
        }
时间: 2024-08-07 21:28:32

将Object转换成Dictionary方法的相关文章

List&lt;Object&gt;转换成Map&lt;String,Object&gt;形式

上一篇讲到了将List<Map<String,Object>> 转换为 List<javaBean>,这次反过来: /** * 用于把List<Object>转换成Map<String,Object>形式,便于存入缓存 * @author zhang_bo * @param keyName 主键属性 * @param list 集合 * @return 返回对象 */ private <T> Map<String, T>

将Object转换成List&lt;?&gt;,避免Unchecked cast: &#39;java.lang.Object&#39; to &#39;java.util.List&lt;java.lang.String&gt;&#39;

java中如果需要将一个object转成list,大部分人会直接使用强制类型转换:(List<String>) obj这样.这样强制转换编译会提示Unchecked cast: 'java.lang.Object' to 'java.util.List<java.lang.String>',编译器的意思该强制类型转换并未做类型校验,强制转换并不安全,可能会抛出异常导致程序崩溃.在很多博客中有人会建议用@SuppressWarnings("unchecked")解

XML转换成数组方法

<?php function xmlToArray2($xml) { // 将XML转为array $array_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $array_data; } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition

Spring MVC 后端获取前端提交的json格式字符串并直接转换成control方法对应的参数对象

场景: 在web应用开发中,spring mvc凭借出现的性能和良好的可扩展性,导致使用日渐增多,成为事实标准,在日常的开发过程中,有一个很常见的场景:即前端通过ajax提交方式,提交参数为一个json对象的字符串,采用application/json的类型,在后端control中利用@RequestBody将json字符串直接转换成对应的Java对象,如: var dataStr = '[{"id":1476,"name":"test"}]';

添加PDF虚拟打印机教程之任意文档转换成PDF方法

将Word转换成PDF有很多方法,例如之前我们也谈过如何使用Office 2010来实现转换.添加PDF虚拟打印机利用"虚拟打印"的方式,也可以将文档转换成为PDF文件,而且在实际操作上,几乎可以将一切能够打印的文档,都打印输出成为PDF文件格式. 我们以下选择一份简单的Word简历作为演示,使用PDF虚拟打印机来将之转换成为PDF文件.使用任何其他文档来操作,都是同样的操作过程,没有任何差别.以下是一份刚刚编辑好的Word简历: 添加PDF虚拟打印机 首先请先选择一款PDF虚拟打印机

C#将Word转换成PDF方法总结(基于Office和WPS两种方案)

有时候,我们需要在线上预览word文档,当然我们可以用NPOI抽出Word中的文字和表格,然后显示到网页上面,但是这样会丢失掉Word中原有的格式和图片.一个比较好的办法就是将word转换成pdf,然后让客户预览,下面来看一下基于Office和WPS的两种解决方案.  一.基于Office的解决方案(推荐使用这种方式) 正如标题所说,基于Office就是要求服务器上面要安装的有Office.我们通过C#代码来调用COM接口,实现将Word转换成PDF.下面来看一下具体实现,首先引用Microso

手机Excel怎么转换成PDF方法

PDF文档正在慢慢成为办公室最常用的办公文档格式.那我们经常制作的Excel表格有办法转换成PDF格式吗?小编尝试过很多转换方法,最近发现迅捷PDF转换器操作简单,转换速度也挺快的,今天就分享给大家. Excel文件转换为PDF文件的操作步骤: 1:安卓手机先在应用市场下载安装迅捷PDF转换器. 2:打开迅捷PDF转换器后,点击下方的"其他转为PDF",然后在转化PDF页面点击Excel转PDF. 3:在添加文件界面,选择需要添加的文件,然后点击文件名字. 4:确定转后的文件后,点击确

java中Object转换成int或String类型方法

转载: http://www.cnblogs.com/1020182600HENG/p/6137206.html Object obj = getObject(); if(obj instanceof Integer) int value = (Integer)obj; 1 String转换为int类型的方法: 1. Integer.parseInt([String]) 2.Integer.valueOf([String]).intValue(); 3.Integer.decode([Strin

[Java类型转换] Object 转换成 String 的三种方法

方法一:Object.toString() obj.toString() 注意:必须保证Object不是null值,否则将抛出NullPointerException异常. 方法二:(String)Object Object o = new Integer(100); String string = (String)o; 注意:需要转换的类型必须是能够转换为String的,否则会出现CalssCastException异常错误. 方法三:String.valueOf(Object) 在使用Str