我正在写一些会检查一个函数并用另一种语言重写该函数的东西所以基本上如果在我的函数F1中,我有这行代码 var x = ab(1)怎么做我将函数体分解为符号或“标记”?
我一直在搜索并认为System.Reflection.MethodInfo.GetMethodBody中的东西可以解决这个问题,但是这个类似乎没有能力做我想做的事情。
我们还有其他解决方案吗?
编辑: 无论如何我们可以使用反射获得方法的“方法体”吗? (比如作为一个字符串或其他东西)
编辑2: 基本上我要做的是在c#/ vb中编写一个程序,当我点击F5 一个序列化函数将(使用反射和)取整个程序(该程序中的所有类)并将其序列化为单个javascript文件。当然javascript没有.net库所以基本上C#/ VB程序会将类的使用限制在.js库(这是一个用c#/ vb编写的库来模拟javascript对象的框架)。
优点是我在编写我的javascript类时具有类型安全性以及许多其他好处,例如使用重载和类/等。由于javascript本身没有类/重载功能,因此它依赖于hacks来完成它。所以基本上序列化函数将基于C#/ VB程序输入为我编写javascript(以及所有黑客和可能的优化)。
我正在尝试编写序列化程序函数
答案 0 :(得分:3)
听起来你想要一个解析树,而Reflection不会给你。看看NRefactory,这是一个VB和C#解析器。
答案 1 :(得分:3)
如果你想这样做,最好的方法是用解析器/词法分析器解析C#/ VB代码,例如Gardens Point Parser Generator,flex / bison或ANTLR。然后在令牌级别,用适当的JavaScript语法重新组装它。 C#和Java有很多。
答案 2 :(得分:2)
在analyzing and transforming source code上查看此答案 这个在translating between programming languages上。
这些假设您使用传统的编译器方法将文本分解为令牌(“lexing”)并将相关的令牌分组为程序结构(“解析”)。如果您的分析不是微不足道的,那么您将需要所有机器,否则它将不可靠。
反思只能给你语言设计师决定给你的东西。他们总是不会给你详细的内部功能。
答案 3 :(得分:1)
如果你想从IL转到其他语言,它可能比首先解析源语言更容易。如果你想走这条路,可以考虑阅读微软的“Volta”项目(IL-> JavaScript),而项目不再可用,仍有老博客讨论它周围的问题。
请注意,仅靠反射是不够的 - 反射为您提供任何特定方法(MethodInfo.GetMethodBody.GetILAsByteArray - http://msdn.microsoft.com/en-us/library/system.reflection.methodbody.aspx)的主体的字节数组,您必须阅读它。有几个公开可用的“IL读者”库。