注:为区分Attribute和Property翻译的不同,Property翻译为属性,Attribute翻译为特性。
在对对象进行反射操作时,有俩个主要的方式处理:一个是System.Reflection命名空间下的一组*Info类,一个是System.ComponentModel命名空间下的一组*Descriptor类。他们的区别可以参考MSDN的相关章节。
这里讨论的是具体到MemberInfo.GetCustomAttributes和MemberDescriptor.Attributes获取特性的不同,他们都返回成员的特性,但获取的结果不同。
假设有下面俩个类:
class A{
private B _b;

public B B {
get { return _b; }
set { _b = value; }
}
}

[System.ComponentModel.Description("注释信息")]
class B : A {
}
这里的A有一个属性B,类型是B.
现在使用MemberInfo.GetCustomAttributes获取B属性的标记
foreach (Attribute att in typeof(A).GetProperty("B").GetCustomAttributes(false)) {
Console.WriteLine(att.ToString());
}
我们发现没有任何输出,因为我们看见B属性上的确没有任何“特性”。
但我们现在转成使用MemberDescriptor.Attributes获取特性。
foreach (Attribute att in System.ComponentModel.TypeDescriptor.GetProperties(typeof(A))["B"].Attributes) {
Console.WriteLine(att.ToString());
}
输出的结果竟然是:
System.ComponentModel.DescriptionAttribute
这说明这个函数将属性的返回类型的标记也作为输出部分了,但我实在不明白MS为什么这样设计,造成我现在的混乱。
在对对象进行反射操作时,有俩个主要的方式处理:一个是System.Reflection命名空间下的一组*Info类,一个是System.ComponentModel命名空间下的一组*Descriptor类。他们的区别可以参考MSDN的相关章节。
这里讨论的是具体到MemberInfo.GetCustomAttributes和MemberDescriptor.Attributes获取特性的不同,他们都返回成员的特性,但获取的结果不同。
假设有下面俩个类:












这里的A有一个属性B,类型是B.
现在使用MemberInfo.GetCustomAttributes获取B属性的标记



我们发现没有任何输出,因为我们看见B属性上的确没有任何“特性”。
但我们现在转成使用MemberDescriptor.Attributes获取特性。



输出的结果竟然是:
System.ComponentModel.DescriptionAttribute
这说明这个函数将属性的返回类型的标记也作为输出部分了,但我实在不明白MS为什么这样设计,造成我现在的混乱。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构