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的成績的全體內容,願望能給年夜家一個參考,也願望年夜家多多支撐。