最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# IsDefined的問題

 更新時間:2016年06月03日 10:36:25   作者:張逸  
這篇文章主要介紹了C# IsDefined的問題,通俗易懂,需要的朋友可以參考下。

在.NET 4.0(當(dāng)然也包括4.0以前的版本)下,用反射判斷某個方法是否運用了自定義Attribute時,可以通過調(diào)用MethodInfo的IsDefined()方法進(jìn)行確認(rèn)。當(dāng)然,IsDefined()方法事實上定義在MethodInfo的父類MemberInfo中,但它僅僅被定義為抽象方法,真正的實現(xiàn)是在MethodInfo的子類DynamicMethod中。調(diào)用方式如下所示:

復(fù)制代碼 代碼如下:
methodInfo.IsDefined(typeof(MyAttribute), false)

然而,在實際開發(fā)中,我發(fā)現(xiàn)該方法有一個問題。如果獲得MethodInfo的方式是通過加載程序集,然后利用反射方式獲得的MethodInfo對象,即使該方法運用了自定義Attribute,返回的結(jié)果仍然是false。例如,我們將需要判斷的方法所在的類定義到一個單獨的Project中,并編譯為單獨的dll文件,然后,利用Assembly的LoadFile()方式獲得程序集:

復(fù)制代碼 代碼如下:
var assembly = Assembly.LoadFile(assemblyPath);
var types = assembly.GetExportedTypes();
types.ToList().ForEach(
  type =>
  {
      var flag =
          type.GetMethods().Where(methodInfo => !methodInfo.IsAbstract).Any(
              methodInfo => methodInfo.IsDefined(typeof(MyAttribute), false));
      Console.WriteLine("Flag of IsDefined is: {0}", flag);
  }
);

打印出來的值為false。

反之,如果不是通過加載程序集,而是直接通過typeof()獲得的Type,并調(diào)用其下MethodInfo.IsDefined()方法,只要該方法被運用了指定的Attribute,返回的結(jié)果則為true。

分析原因,大約是獲得Type的方式不同所造成的。Assembly類的GetExportedType()實現(xiàn)如下所示:

復(fù)制代碼 代碼如下:
[SecuritySafeCritical]
public override Type[] GetExportedTypes()
{
    Type[] o = null;
    GetExportedTypes(this.GetNativeHandle(), JitHelpers.GetObjectHandleOnStack<Type[]>(ref o));
    return o;
}

注意,這里返回的Type[]事實上是通過引用方式傳遞給了JitHelpers的GetObjectHandleOnStack<Type[]>方法中:

復(fù)制代碼 代碼如下:
[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries"), SecurityCritical]
internal static ObjectHandleOnStack GetObjectHandleOnStack<T>(ref T o) where T: class
{
    TypedReference reference = __makeref(o);
    return new ObjectHandleOnStack(reference.GetPointerOnStack());
}

這里將Type轉(zhuǎn)換成了TypedReference。關(guān)鍵大約就是這里,可惜我無法找到typeof()的具體實現(xiàn)方式。代碼追蹤到這里,就無法判斷這里發(fā)生的真實原因了。若要了解.NET底層機制的同學(xué),可以告訴我。

若要解決反射方式無法通過IsDefined()判斷的問題,可以調(diào)用MethodInfo的GetCustomAttribute()方法。例如:

復(fù)制代碼 代碼如下:
private static bool IsAppliedWith(this MethodInfo methodInfo, Type attributeType, string attributeName)
{
    return methodInfo.GetCustomAttributes(attributeType, false).ToString().Contains(attributeName);
}

無論是利用反射加載,還是使用typeof,采用這種方式判斷方法是否運用了指定的Attribute,都是能夠生效的。

以上就是C#IsDefined的問題的全部內(nèi)容,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#實現(xiàn)圖表中鼠標(biāo)移動并顯示數(shù)據(jù)

    C#實現(xiàn)圖表中鼠標(biāo)移動并顯示數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了C#實現(xiàn)圖表中鼠標(biāo)移動并顯示數(shù)據(jù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 關(guān)于C#委托三種調(diào)用的分享使用

    關(guān)于C#委托三種調(diào)用的分享使用

    這篇文章主要介紹了關(guān)于C#委托三種調(diào)用的分享使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • C#?異步多線程入門到精通之Thread篇

    C#?異步多線程入門到精通之Thread篇

    Thread?是?1.0?時代的產(chǎn)物,當(dāng)時?C#?就考慮到了多線程,于是就設(shè)計了?Thread?。其實現(xiàn)在不推薦使用,除非在維護(hù)老的項目已經(jīng)用了的。Thread?也是比較雞肋的,有很多缺陷,但也并不是一無是處
    2021-11-11
  • C#快速排序算法實例分析

    C#快速排序算法實例分析

    這篇文章主要介紹了C#快速排序算法,實例分析了C#排序方法的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • SQLite之C#版 System.Data.SQLite使用方法

    SQLite之C#版 System.Data.SQLite使用方法

    這篇文章主要介紹了SQLite之C#版 System.Data.SQLite使用方法,需要的朋友可以參考下
    2020-10-10
  • C#?wpf使用GDI+實現(xiàn)截屏效果

    C#?wpf使用GDI+實現(xiàn)截屏效果

    wpf做屏幕錄制或者屏幕廣播之類的功能時需要實現(xiàn)截屏,在C#中比較容易實現(xiàn)的截屏方法是使用GDI+,所以本文將展示一下如何使用GDI+實現(xiàn)截屏,需要的可以參考下
    2023-09-09
  • UGUI ScrollRect滑動定位優(yōu)化詳解

    UGUI ScrollRect滑動定位優(yōu)化詳解

    這篇文章主要為大家詳細(xì)介紹了UGUI ScrollRect滑動定位優(yōu)化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C# SimpleJSON字典反序列化實戰(zhàn)教程

    C# SimpleJSON字典反序列化實戰(zhàn)教程

    C# 解析JSON道路千萬條,其中最流行的還是由Newtonsoft出品的Json.NET,只需要將Json的結(jié)構(gòu)做成C#的class,即可實現(xiàn)完美的序列化和反序列化,這篇文章主要介紹了C# SimpleJSON字典反序列化實戰(zhàn)教程,需要的朋友可以參考下
    2024-03-03
  • c#中使用BackgroundWorker的實現(xiàn)

    c#中使用BackgroundWorker的實現(xiàn)

    本文主要介紹了c#中使用BackgroundWorker的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C#讀取二進(jìn)制文件方法分析

    C#讀取二進(jìn)制文件方法分析

    這篇文章主要介紹了C#讀取二進(jìn)制文件方法,較為詳細(xì)的分析了C#讀取二進(jìn)制文件的原理與注意事項,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01

最新評論

乐亭县| 郎溪县| 达孜县| 轮台县| 托里县| 韶关市| 松滋市| 永修县| 石河子市| 诏安县| 安阳市| 洛阳市| 蚌埠市| 布尔津县| 辽宁省| 蒙阴县| 明光市| 平顶山市| 莱芜市| 汤原县| 兴安县| 新乡市| 东丽区| 岢岚县| 蓝山县| 新邵县| 五华县| 巴楚县| 浦江县| 扎赉特旗| 西畴县| 黄山市| 巫溪县| 庆阳市| 通许县| 都江堰市| 湖州市| 宜川县| 台前县| 株洲县| 玉龙|