【问题标题】:Why can I not find a custom attribute on this MethodInfo为什么我在此 MethodInfo 上找不到自定义属性
【发布时间】:2015-08-10 03:43:46
【问题描述】:

我有一个带有以下签名的方法

    [Specification]
    public void slide_serialization() {

从我的代码中的某一点开始,我需要向上移动堆栈跟踪以找到与SpecificationAttribute 最接近的方法(这里的性能不是问题)。我找到了这个方法,但我找不到任何自定义属性。

我想我从未见过这种情况发生。可能是什么原因?

这是一个单元测试程序集,在构建中禁用了优化。

【问题讨论】:

  • 这是哪个 .Net Framework 版本?
  • @rene 有一段时间了,但我相信这是在 .Net 4.5 上
  • @HansPassant 首先,你是说this NonLambdaCallers implementation 错了吗?其次,您是说 slide_serialazation 目前根本不在堆栈跟踪中吗?

标签: c# .net reflection attributes


【解决方案1】:

代码 sn-p 并不多。但是堆栈跟踪很清楚发生了什么。请注意跟踪中的 <>c_DisplayClass5 类型名称。这是一个自动生成的类,由 C# 编译器在重写代码以编译带有闭包的 lambda 表达式时生成。 this Q+A的主题。

slide_serialization() 方法也被重写,现在获得了无法形容的<slide_serialization>_b40 方法名称。尖括号的使用是有意的,它可以确保自动生成的代码中的成员永远不会与程序中的标识符名称发生冲突。

并且您发现了编译器中代码重写逻辑的限制。它不会将原始代码的 [属性] 转移到重写的代码。微软是否认为投入精力不够重要,或者他们无法为每条可能的代码重写规则正确地做到这一点尚不清楚。我强烈怀疑后者,限制是相当痛苦的。通常需要 [SuppressMessage] 属性才能在没有警告的情况下通过代码分析的程序员非常懊恼地发现。

没有简单的解决方法,您必须处理限制。

【讨论】:

  • 谢谢 Hans - 自从我进入那个代码库以来已经有一段时间了,但我相信我会再次遇到它,因为出于某种原因,我似乎是少数几个严重依赖的人之一在令人惊叹的 ApprovalTests 库上,它使用 Stacktrace 步行来生成测试名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多