MemberInfo.GetCustomAttributes 方法 (Boolean)

问题描述

usingSystem;usingSystem.Reflection;//Defineacustomattributewithonenamedparameter.[AttributeUsage(AttributeTargets.All)]publicclassMyAttribute:Attribute{privatestringmyName;publicMyAttribute(stringname){myName=name;}publicstringName{get{returnmyName;}}}//Defineaclassthathasthecustomattributeassociatedwithoneofitsmembers.publicclassMyClass1{[MyAttribute("Thisisanexampleattribute.")]publicvoidMyMethod(inti){return;}}publicclassMemberInfo_GetCustomAttributes{publicstaticvoidMain(){try{//GetthetypeofMyClass1.TypemyType=typeof(MyClass1);//GetthemembersassociatedwithMyClass1.MemberInfo[]myMembers=myType.GetMembers();//DisplaytheattributesforeachofthemembersofMyClass1.for(inti=0;i<myMembers.Length;i++){Object[]myAttributes=myMembers[i].GetCustomAttributes(true);if(myAttributes.Length>0){Console.WriteLine("nTheattributesforthemember{0}are:n",myMembers[i]);for(intj=0;j<myAttributes.Length;j++)Console.WriteLine("Thetypeoftheattributeis{0}.",myAttributes[j]);}}}catch(Exceptione){Console.WriteLine("Anexceptionoccurred:{0}",e.Message);}}}

Object[]myAttributes=myMembers[i].GetCustomAttributes(true);中传入true和false到底有什么区别

解决方案

解决方案二:
区别就是,假如MyClass2继承MyClass1,MyMethod可以重写,用MySecondAttribute属性publicclassMyClass2:MyClass1{[MySecondAttribute("Thisisanexampleattribute.")]publicoverridevoidMyMethod(inti){return;}}

那么对于MyMethod方法true获得两个MyAttribute和MySecondAttributefalse获得一个只有MySecondAttribute
解决方案三:
引用1楼layershow的回复:

区别就是,假如MyClass2继承MyClass1,MyMethod可以重写,用MySecondAttribute属性publicclassMyClass2:MyClass1{[MySecondAttribute("Thisisanexampleattribute.")]publicoverridevoidMyMethod(inti){return;}}

那么对于MyMethod方法true获得两个MyAttribute和MySecondAttributefalse获得一个只有MySecondAttribute

方法是更你说的一样的,属性就不对了。
解决方案四:
我刚才去看了一下,对于属性这个参数应该是无效的RuntimeMethodInfo中在调用的时候最终使用了CustomAttribute::GetCustomAttributes(RuntimeMethodInfo,RuntimeType,bool)RuntimePropertyInfo使用的是CustomAttribute::GetCustomAttributes(RuntimeMethodInfo,RuntimeType)bool参数被忽略实际上只有Method使用了这个bool参数,其他FieldConstructorEvent等都忽略了这个参数为什么我解释不了,没有看到过相关的解释

时间: 2024-09-11 09:25:55

MemberInfo.GetCustomAttributes 方法 (Boolean)的相关文章

[方法“Boolean Contains(System.Guid)”不支持转换为 SQL]的解决办法

Guid ClsID = new Guid("d4ee9c52-8d68-4f33-9485-0926281c78ac");IList<Guid> Ids = WebProduct.GetAllChildByID(ClsID);var query = db.T_Products.Where(p => Ids.Contains((Guid)p.F_ClsID));//这一句编译时无错,但是一执行,就报错 出错信息如下: 方法"Boolean Contains(

[C#]Attribute特性(2)——方法的特性及特性参数

 上篇博文[C#]Attribute特性介绍了特性的定义,类的特性,字段的特性,这篇博文将介绍方法的特性及特性参数相关概念. 3.方法的特性        之所以将这部分单列出来进行讨论,是因为对方法的特性查询的反射代码不同于对类的特性查询的反射代码.在这个例子里,我们将使用一个特性用来定义一种可进行事务处理的方法.    1 public class TransactionableAttribute : Attribute 2 { 3 public TransactionableAttribu

为什么System.Attribute的GetHashCode方法需要如此设计?

昨天我在实现<通过扩展改善ASP.NET MVC的验证机制[使用篇]>的时候为了Attribute 的一个小问题后耗费了大半天的精力,虽然最终找到了问题的症结并解决了问题,但是我依然不知道微软如此设计的目的何在.闲话少说,我们先来演示一下我具体遇到的问题如何发生的. 目录: 一.问题重现 二.通过Attribute的Equals方法和GetHashCode方法进行对等判断 三.Attribute对象和Attribute类型的HashCode 四.倘若为FooAttribute添加一个属性/字段

JSP教程之使用JavaBean完成业务逻辑的方法_JSP编程

本文实例讲述了JSP教程之使用JavaBean完成业务逻辑的方法.分享给大家供大家参考.具体如下: 一.目标: ① 掌握什么是JavaBean: ② 掌握如何编写JavaBean: ③ 掌握如何在JSP中访问JavaBean: ④ 理解JSP中对象的4个作用范围. 二.主要内容: 通过把上一讲中login_process.jsp中的验证过程进行封装形成JavaBean,然后在JSP页面中调用这个JavaBean,介绍JavaBean的编写和访问. 通过简单实例介绍JavaBean对象的4个作用范

Boolean System.Runtime.Serialization.DataContractAttribute.get_IsReference()

这个错误出先在ASP.NET使用EXT.NET1.0(注意版本,好像是在1.0版本下才会报错,0.8的我没遇到过)的过程里,在家里可以用,带到公司就报错:找不到方法:"Boolean System.Runtime.Serialization.DataContractAttribute.get_IsReference()",首先想到的就是Framework的问题,查看事件管理器,发现有警告进程信息: 进程 ID: 1724 进程名: WebDev.WebServer.EXE 帐户名: D

java关于迭代器的分析...设计更通用的容器遍历方法

不知道大家有没有看过我前面的迭代器设计模式的文章,这里我假设大家明白迭代器设计模式的原理...不明白去看前面的一篇 其实在java中对于迭代器的设计无非也就是这种模式 ... 我们知道在遍历容器的时候 例如ArrayList 我们可以对其进行get 和add ...add是从Collecton实现的一个方法...而get是 ArrayList单独添加 的 即不是通用接口. 在HashSet中就不存在get ... 既然面向对象思想的目的之一是代码重用.那么我们是否可以对于这些容器类进行统一的处理

[CLR via C#]18. Attribute

原文:[CLR via C#]18. Attribute attribute可以说是Microsoft .NET Framework提出的最具创意的技术之一了.利用attribute,可以声明性的为自己的代码构造添加注解,从而实现一些特殊的功能.attribute允许将定义的信息应用于几乎每一个元数据表的记录项.这种可扩展的元数据信息能在运行时查询,从而动态改变代码的执行方式.   一.使用attribute attribute可运用于类型和成员.Microsoft采取了一种机制提供对用户自定义

在.NET运行时了解类型信息(3) Paul_Ni(原作)-Windows开发-.NET教程-

访问自定义属性当属性与程序元素相关联后,可以使用反射来查询它们是否存在以及它们的值.用于查询属性的主要反射方法包含在 System.Reflection.MemberInfo.GetCustomAttributes 和 System.Reflection.Assembly.GetCustomAttributes 中.自定义属性的可访问性根据附加该属性的程序集来进行检查.这相当于检查附加自定义属性的程序集中的类型上的方法是否可以调用自定义属性的构造函数.诸如 System.Reflection.A

Java动态代理、cglib动态代理

说动态代理,需要先清楚静态代理.所谓静态代理就是程序员提前实现好的代理类,编译后class文件是已经存在的. 实现原理,利用Java代理模式,由一个代理类持有委托类的实例,并实现委托类一样的接口,来实现增强方法的目的. 我们主要用它来做方法的增强,让你可以在不修改源码的情况下,增强一些方法,在方法执行前后做任何你想做的事情,甚至根本不去执行这个方法.因为在InvocationHandler的invoke方法中,你可以直接获取正在调用方法对应的Method对象.比如可以添加调用日志,做事务控制,对