![]() |
1
42
由于堆栈框架和方法的工作方式似乎存在很多混乱,下面是一个简单的演示:
C#中的属性是语法糖的一种形式。它们在IL中编译为getter和setter方法,有些.NET语言甚至可能无法将它们识别为属性-属性解析完全按照约定完成,IL规范中没有任何规则。 现在,让我们假设您有一个非常好的理由让一个程序想要检查它自己的堆栈(还有 极少数 这样做的实际原因)。你到底为什么希望它在属性和方法上表现得不同?
属性背后的全部理由是它们是一种元数据。如果你想要一个不同的行为,编码它
. 如果一个属性可以表示两种不同的东西,这取决于它是应用于方法还是属性,那么您应该
两个属性
. 将第一个目标设置为
但是再一次,遍历自己的堆栈从调用方法中获取一些属性,充其量是危险的。在某种程度上,您正在冻结程序的设计,这使得任何人都很难扩展或重构程序。这不是通常使用属性的方式。更多 适当的 例如,类似于验证属性:
换句话说,您正在检查 但是你不一定知道这种类型的。XML属性、数据协定属性,甚至属性属性—几乎.NET Framework中的所有属性都是以这种方式使用的,以实现一些与XML相关的动态功能 实例的类型 方案状况 或者堆栈上发生了什么。在创建堆栈跟踪时,您实际上不太可能控制这一点。 所以我再次建议你 不要 使用堆栈遍历方法,除非您有非常好的理由这样做,而您还没有告诉我们。否则,你很可能会发现自己处于一个受伤的世界。
|
![]() |
2
44
属性提供元数据,但对它们所修饰的对象(类、成员等)一无所知。另一方面,被修饰的事物可以要求它被修饰的属性。
|
![]() |
3
5
|
![]() |
4
4
自定义属性由一些代码激活,这些代码在ICCustomAttributeProvider(反射对象)上调用GetCustomAttributes方法,ICCustomAttributeProvider表示应用属性的位置。因此,对于属性,一些代码将获取属性的PropertyInfo,然后对该属性调用GetCustomAttributes。
您的代码可以在(例如)类型上查找此接口:
(假设您将遍历整个反射图,并对每个ICCustomAttribute Provider执行此操作)。有关.net FX中使用的类似方法的示例,您可以查看WCF的“行为”(IServiceBehavior、IOperationBehavior等)。 更新:.NETFX确实有一种通用的拦截框架,但基本上没有以ContextBoundObject和ContextAttribute的形式记录在案。您可以在web上搜索一些将其用于AOP的示例。 |