Как показано здесь, вы теряете ценную информацию при компиляции в IL. Гораздо более целесообразно прочитать код C#, чтобы перевести всю эту информацию высокого уровня.
Просто взломали вместе SyntaxWalker
.
public class FsVisitor : CSharpSyntaxWalker
{
public override void VisitUsingDirective(UsingDirectiveSyntax node)
{
PrintLn("open {0}", node.Name);
}
public override void VisitClassDeclaration(ClassDeclarationSyntax node)
{
PrintLn("type {0} =", node.Identifier);
Enter();
base.VisitClassDeclaration(node);
Exit();
}
public override void VisitMethodDeclaration(MethodDeclarationSyntax node)
{
var isStatic = node.Modifiers.Any(t => t.ValueText == "static");
var modifiers = String.Join(" ", node.Modifiers);
PrintLn("{0}{1} ({2}) = ",
isStatic ? $"{modifiers} member " : $"member {modifiers} this.",
node.Identifier,
String.Join(", ", node.ParameterList.Parameters.Select(p => $"{p.Identifier} : {p.Type}")));
Enter();
base.VisitMethodDeclaration(node);
Exit();
}
public override void VisitInvocationExpression(InvocationExpressionSyntax node)
{
PrintLn("{0}", node);
base.VisitInvocationExpression(node);
}
private StringBuilder builder = new StringBuilder();
private int intendLevel = 0;
void Enter() => intendLevel++;
void Exit() => intendLevel--;
void Print(string format, params object[] args)
{
if (format == null) return;
builder.Append('\t', intendLevel);
builder.AppendFormat(format, args);
}
void PrintLn(string format = default, params object[] args)
{
Print(format, args);
builder.AppendLine();
}
public override string ToString() => builder.ToString();
}
Я попробовал это с простым C# программа:
var code =
@"
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine(""Hello World"");
Console.ReadKey();
}
private void SayHello()
{
Console.WriteLine(""Hello"");
}
}";
var visitor = new FsVisitor();
visitor.Visit(CSharpSyntaxTree.ParseText(code).GetCompilationUnitRoot());
Console.WriteLine(visitor.ToString());
Вывод:
open System
type Program =
static member Main (args : string[]) =
Console.WriteLine("Hello World")
Console.ReadKey()
member private this.SayHello () =
Console.WriteLine("Hello")
Конечно, вывод для тривиальной программы. Потребовалось бы намного больше работы, чтобы поддержать разумное преобразование, но, возможно, преобразование не должно быть совершенным. Может быть, если он достанет вам эшафот, вы, вероятно, сможете заполнить его в идиоматизме c F #.
И, как всегда, в автоматизации:
![enter image description here](https://i.stack.imgur.com/M1fr6.png)