一般に、リソースのリークを避けるために、破棄PSCmdlet
を実装して必要とする型のパラメーターを取るを作成しようとしています。IDisposeable
そのパラメータの も受け入れて、string
その型のインスタンスを作成したいと思いますが、そのオブジェクトを自分で作成した場合は、 から戻る前に破棄する必要がありProcessRecord
ます。
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
明示的な破棄が必要であることをタグ付けするためだけに my をサブクラス化することですが、それはかなりハックに思えます。この場合は機能しますが、シールされたクラスを処理したい場合は明らかに機能しません。
これを行うより良い方法はありますか?