C#自定义属性反射疑问:两种反射方式为何结果不同?
其实这俩调用本质上是在查询完全不同的对象,结果自然天差地别:
第一种调用
foo.GetType().GetProperty("CurrentDate").GetCustomAttributes(true):
你先通过foo.GetType()拿到了Foo类的类型信息,接着GetProperty("CurrentDate")是精准定位到Foo类里名为CurrentDate的那个属性成员,最后调用GetCustomAttributes是在问「这个属性成员身上贴了哪些自定义属性?」——这完全命中了你要找的MyAttribute,所以能拿到预期结果。第二种调用
foo.CurrentDate.GetType().GetCustomAttributes(true):foo.CurrentDate是你从Foo实例里取出的属性值,这个值的类型是DateTime,所以GetType()拿到的是.NET原生的System.DateTime类型的信息。此时调用GetCustomAttributes,是在问「DateTime这个类型本身有哪些自定义属性?」——这和你Foo类里的属性成员半毛钱关系都没有,返回的自然是DateTime类型自带的原生属性了。
打个通俗的比方:你有个收纳盒(Foo类),在盒子的「日期格」(CurrentDate属性成员)上贴了个专属贴纸(MyAttribute)。第一种方式是直接掀开盒子看「日期格」上的贴纸;第二种方式是先把「日期格」里的东西(DateTime值)拿出来,然后去看这个东西本身的标签——那当然看不到你贴在盒子格子上的贴纸啦!
内容的提问来源于stack exchange,提问作者JohanP

