程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# IsDefined的成績

C# IsDefined的成績

編輯:C#入門知識

C# IsDefined的成績。本站提示廣大學習愛好者:(C# IsDefined的成績)文章只能為提供參考,不一定能成為您想要的結果。以下是C# IsDefined的成績正文


在.NET 4.0(固然也包含4.0之前的版本)下,用反射斷定某個辦法能否應用了自界說Attribute時,可以經由過程挪用MethodInfo的IsDefined()辦法停止確認。固然,IsDefined()辦法現實上界說在MethodInfo的父類MemberInfo中,但它僅僅被界說為籠統辦法,真實的完成是在MethodInfo的子類DynamicMethod中。挪用方法以下所示:

methodInfo.IsDefined(typeof(MyAttribute), false)

但是,在現實開辟中,我發明該辦法有一個成績。假如取得MethodInfo的方法是經由過程加載法式集,然後應用反射方法取得的MethodInfo對象,即便該辦法應用了自界說Attribute,前往的成果依然是false。例如,我們將須要斷定的辦法地點的類界說到一個零丁的Project中,並編譯為零丁的dll文件,然後,應用Assembly的LoadFile()方法取得法式集:

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,並挪用其下MethodInfo.IsDefined()辦法,只需該辦法被應用了指定的Attribute,前往的成果則為true。

剖析緣由,年夜約是取得Type的方法分歧所形成的。Assembly類的GetExportedType()完成以下所示:

[SecuritySafeCritical]
public override Type[] GetExportedTypes()
{
    Type[] o = null;
    GetExportedTypes(this.GetNativeHandle(), JitHelpers.GetObjectHandleOnStack<Type[]>(ref o));
    return o;
}

留意,這裡前往的Type[]現實上是經由過程援用方法傳遞給了JitHelpers的GetObjectHandleOnStack<Type[]>辦法中:

[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轉換成了TypedReference。症結年夜約就是這裡,惋惜我沒法找到typeof()的詳細完成方法。代碼追蹤到這裡,就沒法斷定這裡產生的真實緣由了。若要懂得.NET底層機制的同窗,可以告知我。

若要處理反射方法沒法經由過程IsDefined()斷定的成績,可以挪用MethodInfo的GetCustomAttribute()辦法。例如:

private static bool IsAppliedWith(this MethodInfo methodInfo, Type attributeType, string attributeName)
{
    return methodInfo.GetCustomAttributes(attributeType, false).ToString().Contains(attributeName);
}

不管是應用反射加載,照樣應用typeof,采取這類方法斷定辦法能否應用了指定的Attribute,都是可以或許失效的。

以上就是C#IsDefined的成績的全體內容,願望能給年夜家一個參考,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved