Я экспериментировал с Roslyn API в сценарии типа генетического программирования. Это кажется отличным способом программирования такого типа, но фактическая реализация простых сценариев не кажется очень простой, что означает, что я, вероятно, не очень хорошо понимаю, как правильно использовать этот API. Вот простая программа, которую я пытаюсь изменить в своих экспериментах:
string treeText = @"using System;
using System.Collections.Generic;
namespace TestProgram
{
class Program
{
static void Main(string[] args)
{
var myVar = 3;
string myString = ""Hello World"";
List<string> stringList = new List<string>();
Console.WriteLine(myString + myVar);
Console.ReadLine();
}
}
}";
SyntaxTree tree = SyntaxTree.ParseText(treeText);
var compilation = Compilation.Create("test.exe",
syntaxTrees: new[] { tree },
references: new[]
{
new MetadataFileReference(typeof(object).Assembly.Location),
new MetadataFileReference(typeof(Enumerable).Assembly.Location),
});
SemanticModel model = compilation.GetSemanticModel(tree);
В качестве простого примера предположим, что я каким-то образом «случайно» решил, что хочу вставить вызов нового метода, используя экземпляр myString. Что было бы эффективным способом выяснить, какие методы я могу вызывать из этого экземпляра? Каким тогда будет лучший способ создать необходимый синтаксис MethodInvocationSyntax (после того, как я выбрал конкретный метод для использования) из информации о символе? Я нашел метод под названием ResolveOverloads в классе SemanticModel, который появляется там, где мне нужно закончить, но у меня возникли некоторые трудности с определением эффективного пути к параметрам, которые требуются этому методу. Это даже правильный путь, чтобы идти вниз?