惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Know Your Adversary
Know Your Adversary
T
The Blog of Author Tim Ferriss
G
Google Developers Blog
F
Fortinet All Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Engineering at Meta
Engineering at Meta
Blog — PlanetScale
Blog — PlanetScale
M
MIT News - Artificial intelligence
H
Help Net Security
Recent Announcements
Recent Announcements
SecWiki News
SecWiki News
F
Full Disclosure
GbyAI
GbyAI
Attack and Defense Labs
Attack and Defense Labs
PCI Perspectives
PCI Perspectives
Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
L
LangChain Blog
T
Troy Hunt's Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Y
Y Combinator Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Recorded Future
Recorded Future
N
News and Events Feed by Topic
IT之家
IT之家
Hacker News - Newest:
Hacker News - Newest: "LLM"
I
InfoQ
小众软件
小众软件
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
H
Hackread – Cybersecurity News, Data Breaches, AI and More
P
Proofpoint News Feed
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hugging Face - Blog
Hugging Face - Blog
B
Blog
人人都是产品经理
人人都是产品经理
V
V2EX
www.infosecurity-magazine.com
www.infosecurity-magazine.com
B
Blog RSS Feed
S
Security Affairs
The GitHub Blog
The GitHub Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Security Archives - TechRepublic
Security Archives - TechRepublic
Webroot Blog
Webroot Blog
D
Docker
TaoSecurity Blog
TaoSecurity Blog
Google Online Security Blog
Google Online Security Blog
C
Check Point Blog
A
Arctic Wolf

博客园 - sobaby

Sql Server的两个小技巧 用vue.js重构订单计算页面 用vue.js实现购物车功能 一步步实现自己的ORM(五) 一步步实现自己的ORM(四) 一步步实现自己的ORM(三) 一步步实现自己的ORM(二) 一步步实现自己的ORM(一) 修复Windows XP服务扩展视图显示空白 ASP.NET MVC :MVC页面验证与授权 一起学习MVC(4)-entity SQL语句 一起学习MVC(3)-搭建项目 一起学习MVC(2)-数据库设计 一起学习MVC(1)-搭建开发环境 什么是工作流 学习WWF中 关于回调函数 ASP.net:水晶报表的5种表格设计模式 ASP.NET 安全认证(一):如何运用 Form 表单认证
将Object转换成Dictionary方法
sobaby · 2015-03-30 · via 博客园 - sobaby

如果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;
        }