是否可以在c#中的Powershell cmdlet之间共享属性和注释?

时间:2012-06-28 22:54:49

标签: c# powershell cmdlet

在Powershell cmdlet中公开一组相关函数时,是否可以共享属性名称和摘要帮助以在程序集中跨cmdlet规范化这些函数?

我知道这可以使用派生类来完成,但是当有多个具有不同属性的cmdlet要共享时,此解决方案最好是尴尬。

这是一个非常简单的例子。我想分享属性'Name'和所有相关的注释,以便它们在我们生成的N个cmdlet中是相同的,但我想不出在c#中执行此操作的好方法。理想情况下,任何共享都允许指定参数属性,例如Mandatory或Position。

namespace FrozCmdlets
{
using System.Management.Automation;

/// <summary>
/// Adds a new froz to the system.
/// </summary>
[Cmdlet( VerbsCommon.Add, "Froz" )]
public class AddFroz : Cmdlet
{
    /// <summary>
    /// The name of the froz.
    /// For more information on the froz, see froz help manual.
    /// </summary>
    [Parameter]
    public string Name { get; set; }

    protected override void ProcessRecord()
    {
        base.ProcessRecord();
        // Add the froz here
    }
}

/// <summary>
/// Removes a froz from the system.
/// </summary>
[Cmdlet( VerbsCommon.Remove, "Froz" )]
public class RemoveFroz : Cmdlet
{
    /// <summary>
    /// The name of the froz.
    /// For more information on the froz, see froz help manual.
    /// </summary>
    [Parameter]
    public string Name { get; set; }

    protected override void ProcessRecord()
    {
        base.ProcessRecord();
        // Remove the froz here
    }
}
}

1 个答案:

答案 0 :(得分:3)

是的,有一种方法可以在不继承参数的公共基类的情况下执行此操作。它没有很好的记录,只是在IDynamicParameters.GetDynamicParameters方法的评论中暗示过。这是对该主题的更详细的处理。

首先,使用[Parameter]属性声明为属性的公共参数创建一个类:

internal class MyCommonParmeters
{
    [Parameter] 
    public string Foo { get; set; }
    [Parameter]
    public int Bar { get; set; }
    ...
}

然后,每个想要使用这些公共参数的Cmdlet应该实现IDynamicParameters接口以返回MyCommonParameters类的成员实例:

[Cmdlet(VerbsCommon.Add, "Froz")]
public class AddFroz : PSCmdlet, IDynamicParameters
{
    private MyCommonParmeters MyCommonParameters 
        = new MyCommonParmeters();

    object IDynamicParameters.GetDynamicParameters()
    {
        return this.MyCommonParameters;
    }
    ...

使用此方法,PowerShell命令参数绑定器将在MyCommonParameters实例上查找并填充参数,就像它们是Cmdlet类的成员一样。