gpt4 book ai didi

c# - Roslyn CTP - 随机代码修改

转载 作者:行者123 更新时间:2023-11-30 17:54:01 31 4
gpt4 key购买 nike

我一直在基因编程类型的场景中试验 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(一旦我选择了要使用的特定方法)的最佳方法是什么?我在 SemanticModel 类上找到了一个名为 ResolveOverloads 的方法,该方法出现在我需要结束的地方,但我在找出该方法所需参数的有效路径时遇到了一些困难。这甚至是正确的下降路径吗?

最佳答案

首先,为您的变量获取VariableDeclaratorSyntax,例如:

var variable = tree.GetRoot().DescendantNodes()
.OfType<VariableDeclaratorSyntax>()
.Single(v => v.Identifier.ValueText == "myString");

接下来,从 SemanticModel 获取此变量的 LocalSymbol:

var variableSymbol = (LocalSymbol)model.GetDeclaredSymbol(variable);

然后您可以获得可以根据其类型对此变量调用的方法列表。您可以简单地获取属于实例方法的类型的所有成员:

var methods =
variableSymbol.Type.GetMembers()
.OfType<MethodSymbol>()
.Where(m => !m.IsStatic && m.MethodKind == MethodKind.Ordinary);

或者,如果您想包含扩展方法,您可以使用 LookupSymbols():

var methods = model.LookupSymbols(
variable.GetLocation().SourceSpan.Start, variableSymbol.Type,
options: LookupOptions.IncludeExtensionMethods)
.Where(m => !m.IsStatic);

然后您可以根据您的逻辑选择一种可用方法并创建InvocationExpressionSyntax(以下代码假定它是无参数方法):

var invocationExpression =
Syntax.InvocationExpression(
Syntax.MemberAccessExpression(
SyntaxKind.MemberAccessExpression,
Syntax.IdentifierName(variableSymbol.Name),
(SimpleNameSyntax)Syntax.ParseName(selectedMethod.Name)));

然后您需要确定在方法中的什么位置添加表达式以及如何处理其结果(如果有的话)。

关于c# - Roslyn CTP - 随机代码修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16369487/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com