Как правило, я пытаюсь создать PSCmdlet
, который принимает параметр типа, который реализует IDisposeable
и требует удаления во избежание утечки ресурсов.Я также хотел бы принять string
для этого параметра и создать экземпляр этого типа, однако, если я сам создаю этот объект, мне нужно избавиться от него перед возвратом из ProcessRecord
.
I 'используя ArgumentTransformationAttribute
с моим параметром для создания моего IDisposeable
объекта из строки, но я не могу найти способ передать данные из этого класса в мой PSCmdlet
о том, создал ли я объект или нет.Например:
[Cmdlet("Get", "MyDisposeableName")]
public class GetMyDisposeableNameCommand : PSCmdlet
{
[Parameter(Mandatory = true, Position = 0), MyDisposeableTransformation]
public MyDisposeable MyDisposeable
{
get;
set;
}
protected override void ProcessRecord()
{
try
{
WriteObject(MyDisposeable.Name);
}
finally
{
/* Should only dispose MyDisposeable if we created it... */
MyDisposeable.Dispose();
}
}
}
class MyDisposeableTransformationAttribute : ArgumentTransformationAttribute
{
public override Object Transform(EngineIntrinsics engineIntrinsics, Object input)
{
if (input is PSObject && ((PSObject)input).BaseObject is MyDisposeable)
{
/* We were passed a MyDisposeable, we should not dispose it */
return ((PSObject)input).BaseObject;
}
/* We created a MyDisposeable, we *should* dispose it */
return new MyDisposeable(input.ToString());
}
}
Мое лучшее предположение здесь состоит в том, чтобы подкласс мой MyDisposeableClass
просто пометить, что он требует явного удаления, но это кажется довольно хакерским, и хотя это работает в этом случае, оно, очевидно,не работать, если я хочу иметь дело с закрытым классом.
Есть ли лучший способ сделать это?