Ich verwende Roslyn-Bibliothek. Ich möchte die Anweisungen nach passender Zeile hinzufügen: Hier ist die Voraussetzung. zunächst mag ich die folgende Zeile finden:Roslyn - wie Anweisungen nach dem Abgleich hinzufügen InvocationExpressionSyntax
_container.RegisterInstance(NavigationService);
Und dann will ich im Folgenden Aussage nach der obigen Zeile hinzufügen:
_container.RegisterInstance<ISessionStateService>(SessionStateService);
_container.RegisterInstance<IFlyoutService>(FlyoutService);
Jede Hilfe wäre sehr geschätzt.
EDIT:? (Ich habe die Ausdrücke geschaffen, aber jetzt, wie diese beiden experssions meiner targetExpression hinzufügen
string strContent = File.ReadAllText(strPath);
SyntaxTree tree = SyntaxTree.ParseText(strContent);
var targetExpression = tree.GetRoot().DescendantNodes().OfType<InvocationExpressionSyntax>()
.FirstOrDefault(
x => x.Expression.ToString().Contains("_container.RegisterInstance") && x.ArgumentList.ToString().Contains("NavigationService"));
InvocationExpressionSyntax replacementNode1 =
Syntax.InvocationExpression(Syntax.ParseExpression(@"_container.RegisterInstance<ISessionStateService>(SessionStateService);"));
InvocationExpressionSyntax replacementNode2 =
Syntax.InvocationExpression(Syntax.ParseExpression(@"_container.RegisterInstance<IFlyoutService>(FlyoutService);"));
MethodDeclarationSyntax targetMethod = (MethodDeclarationSyntax)targetExpression.Parent.Parent.Parent;
List<InvocationExpressionSyntax> list = targetMethod.DescendantNodes().OfType<InvocationExpressionSyntax>().ToList();
int index = list.IndexOf(targetExpression);
list.Insert(index + 1, replacementNode1);
list.Insert(index + 1, replacementNode2);
jetzt die Frage ist, wie mein aktualisiert Baum bekommen ?? bedeutet, wie meine Liste zu aktualisieren und erhalten Sie den Baum mit diesen Änderungen
Edit:. Jetzt erzeugen kann ich die Knoten hinzufügen, aber nur Ausgabe formatiert .. der Abstand nicht korrekt ist hier ist der Code:.
string strContent = File.ReadAllText(strPath);
SyntaxTree tree = SyntaxTree.ParseText(strContent);
ExpressionStatementSyntax expressionStatementSyntax =
Syntax.ExpressionStatement(Syntax.ParseExpression("_container.RegisterInstance(NavigationService);"));
var targetBlock =
tree.GetRoot()
.DescendantNodes()
.OfType<BlockSyntax>()
.FirstOrDefault(x => x.Statements.Any(y => y.ToString().Contains("_container.RegisterInstance")));
StatementSyntax syn1 =
Syntax.ParseStatement(@"_container.RegisterInstance<ISessionStateService>(SessionStateService);");
StatementSyntax syn2 = Syntax.ParseStatement(@"_container.RegisterInstance<ISessionStateService>(SessionStateService2);");
List<StatementSyntax> newSynList = new List<StatementSyntax> { syn1, syn2 };
SyntaxList<StatementSyntax> blockWithNewStatements = targetBlock.Statements;
foreach (var syn in newSynList)
{
blockWithNewStatements = blockWithNewStatements.Insert(1, syn);
}
BlockSyntax newBlock = Syntax.Block(blockWithNewStatements);
var newRoot = tree.GetRoot().ReplaceNode(targetBlock, newBlock);
es generiert die Ausgabe mit allen Linien linksbündig .. irgendwelche Vorschläge?
Was haben Sie bisher? –
Ich bin nur in der Lage, meine Ziellinie zu finden ... aber ich bin mir nicht sicher, wie die Anweisungen nach meiner Ziellinie hinzugefügt werden. Zeichenfolge strContent = File.ReadAllText (strPath); SyntaxTree tree = SyntaxTree.ParseText (strContent); var targetMethod = tree.GetRoot(). DescendantNodes(). OfType() .FirstOrDefault ( x => x.Expression.ToString(). Enthält ("_ container.RegisterInstance") && x.ArgumentList.ToString() .Contains ("NavigationService")); –
Ich habe den Thread bearbeitet .. Ich bin in der Lage, die Zielausdruck zu bekommen und auch zwei Knoten erstellt, die ich an meinem Zielausdruck anhängen möchte ... Irgendwelche Vorschläge? –