C# 自定义属性上的反射或正则表达式

C# 自定义属性上的反射或正则表达式,c#,reflection,attributes,custom-attributes,C#,Reflection,Attributes,Custom Attributes,我已经看过,现在我知道如何创建和使用反射来查看属性的元数据,但是否可以制作一个独立的工具来分析cs文件并提取使用的属性 我想做什么? 基本上,我正在开发一个以C#code作为输入的工具。下一步是查看源代码中使用了哪些属性。提取固有属性和自定义属性 问题? 如果您在定义了属性的同一个项目中使用反射,这是有意义的,但是我不知道应该朝哪个方向移动来编写一个单独的工具,可以为您提供上述提取的静态数据和属性元数据 有人说我应该使用Regex来提取文件中的属性,而其他人说我需要使用这些属性 此外 上述工作将

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

我想做什么?

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

问题?

如果您在定义了
属性的同一个项目中使用
反射
,这是有意义的,但是
我不知道应该朝哪个方向移动
来编写一个单独的工具,可以为您提供上述提取的静态数据和属性元数据

有人说我应该使用
Regex
来提取文件中的属性,而其他人说我需要使用这些属性

此外


上述工作将使我拥有一个应用程序,用于从
源代码中恢复基于
属性(注释)的设计模式。我不太清楚是
Regex
会来解救我,还是我需要
Reflection
之类的东西。因为反射处理的是运行时。我不必处理运行时。只是静态文件分析

显然我没有足够的声誉来评论,所以我不得不说这是一个答案

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


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

显然我没有足够的声誉来评论,所以我不得不说这是一个答案

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


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

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

如果你不知道该选择哪个解析器,我推荐Rosalyn,因为它应该是解析C#代码最简单的方法(它是专门为它设计的)。您可以在此处找到解析示例:


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

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

如果你不知道该选择哪个解析器,我推荐Rosalyn,因为它应该是解析C#代码最简单的方法(它是专门为它设计的)。您可以在此处找到解析示例:


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

我无法理解反射和C#项目文件是如何与您的问题联系在一起的。若您使用的是反射—您使用的是已经编译的可执行文件或dll,所以不需要解析项目文件。如果需要使用源代码,则不能使用reflection@Archeg文件只是为了阅读源代码,看看实现了什么。如果我必须使用源代码,我应该使用什么来代替反射?如果你真的需要解析源代码,我会看看Rosalyn。但我从未用过,所以不确定它是否适合你。您确定需要解析源代码吗?为什么反射不适合你?也许你可以写一些关于你的任务的东西。为什么需要这些属性?例如,如果您只需要列出代码中使用的所有属性,简单的正则表达式就足够了。要想让System.CodeDom.Compiler把一个相当大的任务变成一个琐碎的任务是相当困难的。我无法理解反射和C#项目文件是如何与您的问题联系在一起的。若您使用的是反射—您使用的是已经编译的可执行文件或dll,所以不需要解析项目文件。如果你需要与来源-哟