手机
当前位置:查字典教程网 >编程开发 >C#教程 >C# IsDefined的问题
C# IsDefined的问题
摘要:在.NET4.0(当然也包括4.0以前的版本)下,用反射判断某个方法是否运用了自定义Attribute时,可以通过调用MethodInfo的...

在.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的问题的全部内容,希望能给大家一个参考,也希望大家多多支持查字典教程网。

【C# IsDefined的问题】相关文章:

解读赫夫曼树编码的问题

C# 调用Delphi dll 实例代码

C# zxing二维码写入的实例代码

在C#中 webbrowser的使用心得

C# 合并GriewView相同列的小例子

C#中接口(interface)的理解

C# WinForm程序完全退出的问题解决

C#中 const 和 readonly 的不同

基于C# 中可以new一个接口?的问题分析

C#中fixed关键字的作用总结

精品推荐
分类导航