用于TypeScript代码生成器的Roslyn与Reflection

我正在开发一个TypeScript代码生成器,它将使用C#类上的自定义属性来生成TypeScript定义和代码文件。

我正在考虑TypeScript代码生成/源文件分析的两个选项:

  • 对编译程序集的思考
  • 罗斯林CTP
  • 该工具将使用属性和方法的自定义属性来生成TypeScript文件。 现在我不打算将C#方法体转换为JavaScript,但将来可能会这样做。 因此,我正在认真考虑Roslyn。 然而,为了简单地生成我的TypeScript类的轮廓,我想我可以使用反射和自定义属性。

    我想知道:

    a)Roslyn是否提供Reflection功能? 我的理解是,我无法使用Reflection获取方法体。

    b)Roslyn CTP许可证是否会阻止我根据开源许可证分发该工具? 阅读许可证后,我不清楚这一点


    我只是沿着这些线做了一些事情 - 非常适合在c#类中通过Typescript创建数据模型。 我构建了它,以生成一个模拟模型基本数据的单个AMD模块。 还支持泛型,并使用Knockout属性创建一个类,包括toJS()方法和更新(data:Interface)方法来更新您的类。

    整个事情只是一个单一的T4模板。 如果有人发现这一点,并有兴趣:http://spabuilder.wordpress.com/2014/07/31/generating-typescript-from-c/

    如果您正在使用数据注释,还要尊重数据模型的[KeyAttribute]和[Timespan]属性。


    该许可证不仅禁止您个人分发二进制文件? 它并不禁止你将你的NuGet包的依赖添加到Rosyln CTP NuGet包中。 您个人无法提供这些位,但是您可以让NuGet自动拉入Roslyn。

    因此,请避免将Rosyln源代码或二进制文件检入您的版本控制。


    我一直在生成js,我发现Reflection是一个更好的工具。 我基本上把我的生成器指向元数据来自的项目的bin文件夹。 加载所有需要的程序集时可能会遇到一些困难,并且需要注意bin文件夹中的程序集版本以及生成器项目引用的相同程序集版本。 但是,一旦你完成了所有这一切,我以最小的难度完成了这个任务,反射使用起来更容易,而且更可靠。

    有了Roslyn,你基本上只是解析c#。 Roslyn做得非常好,但我很犹豫从Reflection中切换到它。 通过反思,您可以更可靠地获取元数据。

    假设您需要装饰控制器类的RoutePrefixAttribute的前缀属性。 如果你解析c#,你可能有:[RoutePrefix(“stringliteral”)]或[RoutePrefix(constantString)]。 所以,你必须担心它是一个常量表达式还是常量表达式,然后找出如何获得一个常量表达式的值,担心可以将参数传递给一个atatribute的所有不同方式(例如,这样做打破你的代码:[RoutePrefix(Prefix =“literal”)] ...

    一旦你用反射处理实际的运行时对象,一切都变得更简单。 您有一个很好的RoutePrefixAttribute对象,并且您可以使用routePrefix.Prefix来可靠地获取前缀的值。

    这仅仅是一个例子,说明如何用Reflection来做事更容易。 这是以一种类型安全的方式从一组c#对象中收集元数据和从c#代码中获取数据的区别,尽管它有一个非常好的抓取工具。

    编辑:自写这个答案以来,我已经点了子弹,并切换到罗斯林。 一旦你掌握了它的功能,它是相当强大的,我确实发现了一个很大的优势:你可以从Visual Studio插件中获得对工作区的引用,并且可以轻松地在插件中做各种各样的东西。

    链接地址: http://www.djcxy.com/p/66047.html

    上一篇: Roslyn vs Reflection for TypeScript code generator

    下一篇: A Pythonic way to read CSV with row and column headers