说我有这个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