【问题标题】:Reflection or Regex on Custom attributes自定义属性上的反射或正则表达式
【发布时间】:2026-01-16 12:30:01
【问题描述】:

我见过Attributes and Reflection,现在我知道如何创建和使用反射来查看属性的元数据,但是是否有可能制作一个可以分析cs 文件并提取使用的属性的独立工具?

我想做什么?

基本上,我正在开发一个以C# code 作为输入的工具。下一步是查看该源代码中使用了哪些属性。提取IntrinsicCustom Attributes

有问题吗?

如果您在定义了attributes 的同一个项目中使用reflection,这是有意义的,但是I do not know in what direction I should move 编写一个单独的工具,可以为您提供上述提取的静态和属性元数据。

有人说我应该使用Regex 来提取文件中的属性,而其他人说我需要使用Irony - .NET Language Implementation Kit

此外

以上工作将使我拥有一个应用程序,该应用程序将用于来自Source Codeattributes(annotation) based Design Pattern Recovery。我不太清楚Regex 是否会来救援,或者我需要类似Reflection 的东西。由于反射处理运行时。我不必处理运行时间。只是静态文件分析

【问题讨论】:

  • 我无法理解反射和 C# 项目文件是如何与您的问题相关联的。如果您使用反射 - 您正在使用已编译的可执行文件或 dll,因此您不需要解析项目文件。如果您需要使用源 - 您不能使用反射
  • @Archeg 文件只是为了阅读源代码,看看实现了什么。如果我必须使用源代码,我应该使用什么而不是反射?
  • 如果你真的需要解析源代码,我会看 Rosalyn。但我从未使用过它,所以不确定它是否适合你。您确定需要解析源代码吗?为什么反射不适合你?
  • 也许你可以写更多关于你的任务的东西。为什么需要这些属性?例如,如果您只需要列出代码中使用的所有属性,简单的 Regex 就足够了。
  • 很难通过 System.CodeDom.Compiler 将相当大的任务变成微不足道的任务。

标签: c# reflection attributes custom-attributes


【解决方案1】:

如果我正确理解了您的问题,您确实需要解析您的代码。正则表达式不会帮助您,因为除了解析属性之外,您还需要解析类层次结构。反射可能会起作用,但您将无法向用户显示结果。因此,最好的办法是使用任何解析器从源中获取表达式树,然后对其进行调查。

如果您不知道该选择哪个解析器 - 我推荐 Rosalyn,因为它应该是解析 C# 代码最简单的方法(它是专门为它设计的)。您可以在此处找到解析示例: http://blog.filipekberg.se/2011/10/20/using-roslyn-to-parse-c-code-files/

我认为它应该对你的任务非常强大和有用

【讨论】:

    【解决方案2】:

    显然我没有足够的声誉来发表评论,所以我不得不说这个作为答案。

    反射处理运行时类型信息。它是一种机制,用于找出程序员不知道的类型(也许其他人正在为您提供代码库,但忘记记录它)。反射将为您提供有关类的公共契约所需的任何信息,包括方法、属性、字段、属性和继承的接口/类。

    需要的是一个解析器。解析器是处理文件和提取特定信息的标准编程概念。您正在寻找代码文件中的信息,这些信息还不是运行时类型,这意味着反射还没有关于它们的信息,但是您有眼睛,因为它们仍然是代码文件。如果您的眼睛不够用(如果您问这个问题,我怀疑眼睛不够用),您需要编写一个解析器。从 cs 文件中提取特定信息非常简单。属性的正则表达式是:\[.+\]

    【讨论】:

    • 我开始认为你还没有真正证明你需要什么。根据您所说,只需正则表达式匹配源文件即可为您提供源文件中声明的属性的完整列表。