Как правило, я пытаюсь создать PSCmdlet
, который принимает параметр типа, который реализует IDisposeable
, и требует удаления во избежание утечки ресурсов. Я также хотел бы принять string
для этого параметра и создать экземпляр этого типа, однако, если я сам создам этот объект, мне нужно будет его утилизировать до возвращения из ProcessRecord
.Передача данных в PSCmdlet из его АргументTransformationAttribute
Я использую 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
просто помечать, что она нуждается в явной утилизации, но это кажется довольно Hacky, и в то время как он работает в этом случае, очевидно, будет не если работать я хотел иметь дело с запечатанным классом.
Есть ли лучший способ сделать это?
К сожалению, нет, в этом случае 'MyDisposeable' является библиотекой, которую я не могу изменить, за исключением некоторого отражения. –