我一直在搞乱生成js,我发现反射是一个更好的工具。我基本上将我的生成器指向元数据来自的项目的 bin 文件夹。加载所有需要的程序集可能会遇到一些困难,并且需要注意 bin 文件夹中的程序集版本以及生成器项目引用的相同程序集的版本。但是一旦你克服了所有这些,我以最小的难度完成了,Reflection 更容易使用,也更可靠。
使用 Roslyn,您基本上只是在解析 c#。Roslyn 在这方面做得很好,但我犹豫要不要从 Reflection 切换到它。通过反射,您可以获得更可靠的元数据。
假设您想要装饰控制器类的 RoutePrefixAttribute 的 Prefix 属性。如果你正在解析 c#,你可能有:[RoutePrefix("stringliteral")] 或 [RoutePrefix(constantString)]。因此,您必须担心它是文字还是常量表达式,然后找出如何获取常量表达式的值,担心可以将参数传递给属性的所有不同方式(例如,这破坏你的代码:[RoutePrefix(Prefix="literal")]...
一旦您使用反射处理实际的运行时对象,一切都会变得更容易。你有一个很好的 RoutePrefixAttribute 对象,你可以去 routePrefix.Prefix 可靠地获取前缀的值。
这只是使用反射做事更容易的一个例子。这是以类型安全的方式从一组 c# 对象中收集元数据与从 c# 代码中抓取数据之间的区别,尽管它使用了一个非常好的抓取工具。
编辑:自从写了这个答案后,我咬紧牙关转而使用 Roslyn。一旦你掌握了它,它就会变得相当强大,而且我确实发现了一个很大的优势:你可以从 Visual Studio 插件中获得对工作区的引用,并轻松地在插件中做各种事情。