【发布时间】:2016-03-14 17:17:45
【问题描述】:
我目前正在尝试使用 PowerShell 3.0 中引入的 AST 功能来修改 ScriptBlock。我的要求是ScriptBlock的参数块中的所有参数都得到一个[Parameter(Mandatory)]属性。
基本上代码应该修改这个:
Param([string]$x)
Write-Host $x
到这里:
Param([Parameter(Mandatory)][string]$x)
Write-Host $x
但是,我在添加新属性时遇到了问题,因为它需要一个 IScriptExtent,而我不知道应该如何创建一个新的 IScriptExtent。
如何创建新的脚本范围?我可以为该职位使用什么值?我是否必须更改所有以下范围的位置?
我尝试仅重用我正在修改的每个参数的范围,但不幸的是,这似乎并没有产生应有的结果(例如,当我在修改后的 ScriptBlock 上调用 ToString 时,我没有看到任何变化)。
到目前为止,我的实现是基于 ICustomAstVisitor 找到的 here。
最重要的方法如下所示:
public object VisitParameter(ParameterAst parameterAst)
{
var newName = VisitElement(parameterAst.Name);
var extent = // What to do here?
var mandatoryArg = new AttributeAst(extent, new ReflectionTypeName(typeof (ParameterAttribute)),
new ExpressionAst[0],
new[] {new NamedAttributeArgumentAst(extent, "Mandatory", new ConstantExpressionAst(extent, true), true)});
var newAttributes = new[] {mandatoryArg}.Concat(VisitElements(parameterAst.Attributes));
var newDefaultValue = VisitElement(parameterAst.DefaultValue);
return new ParameterAst(parameterAst.Extent, newName, newAttributes, newDefaultValue);
}
【问题讨论】:
标签: powershell abstract-syntax-tree extent