說我有這個InvocationExpression,GetDelegate<Func<double,double,double>>("Add")()
,我將如何刪除在ArgumentListSyntax中找到的Open/Close parens?
我試圖找出Node.ReplaceNodes <>()方法,但即使如此,我不知道如何替換Nodes。從ArgumentListSyntax中刪除OpenParen SyntaxToken的簡單方法是什麼?
我正在檢查出this bit of sample code,他將整個節點拆分成組件以改變它。有沒有更簡單的方法來做到這一點?我找不到任何種類的Node.RemoveNode()
方法。
我也試圖做這樣的事情,沒有成功:
argNodeMinusParen = argNodeMinusParen.WithArgumentList(argNodeMinusParen .ArgumentList.ReplaceToken(Syntax.Token(SyntaxKind.OpenParenToken), Syntax.Token(SyntaxKind.WhitespaceTrivia)));
澄清: 我試圖修改此InvocationExpression這樣的:
GetDelegate<Func<double,double,double>>("Add")()
到
GetDelegate<Func<double,double,double>>("Add")
的問題,我試圖解決:
開始使用此代碼。
private void Init()
{
StoredMethods.Add("Add", /*new InvocationExpression for identical signature method as controller.Add*/);
StoredMethods.Add("Mul", /*new InvocationExpression for identical signature method as controller.SubMember.Mul*/);
}
private void RandomMethod()
{
var result = controller.SubMember.Mul(2, 3);
var result2 = controller.Add(5, 5);
var result3 = controller.Add(controller.SubMember.Mul(4, 5), 6);
var result4 = controller.Subtract(5, controller.Add(1, 1));
}
public Dictionary<string, InvocationExpressionSyntax> StoredMethods
{
get;
set;
}
我想把它變成這個。 請注意,這只是半僞代碼,我實際上在做一堆更復雜的靜態泛型類型的東西,爲簡明起見,這是簡化的。
對於在整個項目中發現的每個調用,如果在StoredMethods中找到方法名稱,則將調用替換爲StoredMethod調用。 結果應該是這樣的:
private void RandomMethod()
{
var result = StoredMethods.GetDelegate("Mul")(2, 3);
var result2 = StoredMethods.GetDelegate("Add")(5, 5);
var result3 = StoredMethods.GetDelegate("Add")(StoredMethods.GetDelegate("Mul")(4, 5), 6);
var result4 = controller.Subtract(5, StoredMethods.GetDelegate("Add")(1, 1));
}//Notice that Subtract was NOT substituted, because it wasn't in StoredMethods, where Add was replaced in the inner arg
我更大的問題是試圖找出如何處理嵌套/複合類和成員。我認爲遞歸可以處理多個MemeberAccess表達式,但是我很難將問題分解到我的頭上。 另外,我使用SyntaxRewriter
訪問每個節點,所以我不知道如何把compilationUnit成
你可以澄清你想要什麼,一旦更換完成?只是最後一批失蹤的人,或(「添加」)的東西? – 2012-07-30 03:13:39