日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何通过反射调用扩展方法?

發(fā)布時間:2025/4/5 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何通过反射调用扩展方法? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在某日回答MSDN客戶問題的時候,碰到了一道對我而言新奇的題目(大牛們不要嘲笑俺,可能我少見多怪,寫此文算是給出道著們遇到此類問題提一個醒)

題目如下:

var list=new List<string>();

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

mi就是為null,搞了半天也不知道那里出錯,list里明明有Cast方法,最后查了下資料才知道Cast是個擴展方法,擴展泛型方法如何反射?

我是先把他的代碼黏貼到控制臺下運行,結(jié)果報錯——找不到這個方法——后來想想,對了:反射的方法必須是這個類中已知包含的,List的定義中并沒有包含擴展方法,至于為什么會有提示,那純粹是微軟編譯器作怪的緣故。

接著,我馬不停蹄趕到MSDN上查閱擴展方法定義在哪個類中——在System.Linq命名空間下的Enumerable靜態(tài)類中。

找到了,OK!既然這個方法對于List是擴展,那么對于這個Enumerable類而言不等于是普通的靜態(tài)方法嗎?好,既然如此,我就直接對你靜態(tài)類中的這個靜態(tài)方法進行反射了,出工了——

?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>接口作為傳入?yún)?shù)。T是什么呢?顯然我怎么把這個泛型的準確類型告訴反射裝置呢?

哦,上網(wǎng)問問好友們,使用了一個方法:

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

這個方法會將方法的泛型傳入反射裝置。然后進行反射調(diào)用。

哈哈,?,大功告成!

轉(zhuǎn)載于:https://www.cnblogs.com/serviceboy/archive/2011/05/12/2044349.html

總結(jié)

以上是生活随笔為你收集整理的如何通过反射调用扩展方法?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。