一般来说,我想创建一个 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 只是为了标记,它需要明确的处置,但是,这似乎相当哈克,虽然它的工作原理在这种情况下,显然不会工作如果我想要处理密封舱。

有没有更好的方式做到这一点?

有帮助吗?

解决方案 2

最后,我简单地使用的参数接受一种类型包装 MyDisposeable.我的初始关注这样做的是,使用一个内部的类型为一个参数影响的功能性。(也许它会产生负面影响的文档,但在命令的文件是完全控制的一个XML文件中。)

在一些测试中,没有出现任何问题采用一个内部的类参数和只是让的转变,接受公共类型。所以我只是创建一个包装类别:

public class MyDisposeableWrapper
{
    public MyDisposeable MyDisposeable
    {
        get;
        set;
    }

    public bool NeedsDisposed
    {
        get;
        set;
    }

    public MyDisposeableWrapper(MyDisposeable myDisposeable, bool needsDisposed)
    {
        MyDisposeable = myDisposeable;
        NeedsDisposed = needsDisposed;
    }
}

和参数取代替。在转型的属性,只需设置 NeedsDisposed 根据参数是否采取了一个 MyDisposeable 或建造的一个。例如:

if(input is MyDisposeable)
{
    return new MyDisposeableWrapper((MyDisposeable) input, false);
}
else
{
    /* construct MyDisposeable from the input */
    return new MyDisposeableWrapper(myDisposeable, true);
}

其他提示

而不是继承,可以添加酒店你MyDisposable类?

public class MyDisposable
{
    ...   
    public bool IsAttributeCreated { get; set; }
}

然后在你的属性码

/* We created a MyDisposeable, we *should* dispose it */
return new MyDisposeable(input.ToString()){IsAttributeCreated=true};

最后,在你的最后块

finally
{
    /* Should only dispose MyDisposeable if we created it... */
    if (MyDisposable.IsAttributeCreated)
        MyDisposeable.Dispose();
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top