如何通过反射调用扩展方法?
在某日回答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});
這個方法會將方法的泛型傳入反射裝置。然后進行反射調用。
哈哈,?,大功告成!
轉載于:https://www.cnblogs.com/serviceboy/archive/2011/05/12/2044349.html
總結
以上是生活随笔為你收集整理的如何通过反射调用扩展方法?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 26个导航设计非常独特的网站案例欣赏
- 下一篇: p2p平台倒闭投资款还能回来吗