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

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
H
Help Net Security
V
Visual Studio Blog
J
Java Code Geeks
Stack Overflow Blog
Stack Overflow Blog
Microsoft Security Blog
Microsoft Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
MyScale Blog
MyScale Blog
The Cloudflare Blog
Martin Fowler
Martin Fowler
D
Docker
腾讯CDC
F
Fortinet All Blogs
雷峰网
雷峰网
GbyAI
GbyAI
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Blog — PlanetScale
Blog — PlanetScale
Engineering at Meta
Engineering at Meta
博客园 - 聂微东
博客园 - 叶小钗

博客园 - maledong

JQuery学习笔记——nt-child的使用 - maledong - 博客园 求最大公约数与最小公倍数的算法 ASP.NET专题研究——角色和Profile ASP.NET专题研究——用户登录、注册和发送密码 NET基本探究——事件 ASP.NET专题研究——登录权限 C#4.0和VS2010新特性(三) C#4.0和VS2010新特性(二) C#4.0和VS2010新特性(一) F# 快乐之旅(一)——F#尝鲜 MVC专题研究(五)——数据验证 MVC专题研究(四)——Html中的扩展方法 MVC专题研究(三)——数据绑定和传送 MVC专题研究(二)——神奇的URL MVC2专题研究(一)——用MVC组织管理您的家庭收入 典型算法及应用——“递归法”探究 ASP.NET专题研究——资源文件的使用 NET基本探究系列——委托 NET常见类系列探究——序列化和反序列化的应用
如何通过反射调用扩展方法?
maledong · 2011-05-12 · via 博客园 - maledong

在某日回答MSDN客户问题的时候,碰到了一道对我而言新奇的题目(大牛们不要嘲笑俺,可能我少见多怪,写此文算是给出道着们遇到此类问题提一个醒)

题目如下:

var list=new List<string>();

var mi=list.GetType().GetMethod("Cast");

mi就是为null,搞了半天也不知道那里出错,list里明明有Cast方法,最后查了下资料才知道Cast是个扩展方法,扩展泛型方法如何反射?

我是先把他的代码黏贴到控制台下运行,结果报错——找不到这个方法——后来想想,对了:反射的方法必须是这个类中已知包含的,List的定义中并没有包含扩展方法,至于为什么会有提示,那纯粹是微软编译器作怪的缘故。

接着,我马不停蹄赶到MSDN上查阅扩展方法定义在哪个类中——在System.Linq命名空间下的Enumerable静态类中。

找到了,OK!既然这个方法对于List是扩展,那么对于这个Enumerable类而言不等于是普通的静态方法吗?好,既然如此,我就直接对你静态类中的这个静态方法进行反射了,出工了——

 List<string> strings = new List<string> { "1", "2", "3" };

            MethodInfo mi = typeof(Enumerable).GetMethod("Cast", BindingFlags.Public | BindingFlags.Static);

            var list = (IEnumerable<string>)mi.Invoke(null, new object[]{strings}); //这里出错

            foreach (var item in list)
            {
                Console.WriteLine(item);
            }

这里报错?为什么呢?我使用Reflector反射去看微软对于Cast方法的定义——Cast需要一个IEnumerable<T>接口作为传入参数。T是什么呢?显然我怎么把这个泛型的准确类型告诉反射装置呢?

哦,上网问问好友们,使用了一个方法:

            var list = (IEnumerable<string>)mi.MakeGenericMethod(typeof(string)).Invoke(null, new object[]{strings});

这个方法会将方法的泛型传入反射装置。然后进行反射调用。

哈哈, ,大功告成!