问题描述
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等都忽略了这个参数为什么我解释不了,没有看到过相关的解释