2012-06-28 22 views
7

在Powershell cmdlet中公开一组相关函数时,是否可以共享属性名称和摘要帮助,以便在程序集中跨cmdlet对这些函数进行规范化处理?是否可以在c#中的Powershell cmdlet之间共享属性和注释?

我知道这可以通过派生类来完成,但是当有多个具有不同属性的cmdlet可以共享时,这种解决方案充其量是尴尬的。

这是一个非常简单的例子。我想分享属性“名称”和所有相关的评论,以便它们在我们正在制作的N个cmdlet中是相同的,但我想不出在c#中执行此操作的好方法。理想情况下,任何共享都将允许指定参数属性,如强制或位置。

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 
    } 
} 
} 
+0

如果你不想派生(我不清楚的原因)分享评论的最佳方式是使用XML包括(看看框架的源代码)。您将代码文档保存在代码之外,可以由其他人编写和维护(如果需要)代码文档,并且可以跨类甚至程序集共享代码文档。 –

+0

@Adriano感谢您关注通过XML包含共享评论的想法。不想得到的理由是可以干净地做。如果小命令A使用P1,P2,而小命令B使用P2,P3和小命令C使用P1,P3,则无法根据需要派生和共享P1,P2,P3。 我也意识到我的共享这些属性的想法可能不是有根据的。只要发生了一些变化,更新N个地方就成了一件麻烦事,我肯定会讨厌拷贝和粘贴代码。 – pennyowe

+0

哦,那你是对的!我只是认为他们有很多共享属性。我认为唯一的方法就是通过include(但只对评论可行)。有一天(也许......)我们将有多重继承... –

回答

3

是的,是有办法做到这一点,而不从参数一个共同的基类继承。它没有很好的记录,只暗示在IDynamicParameters.GetDynamicParameters方法的评论。以下是对该主题的更详细的处理。

首先,创建一个类声明为与[参数]性能的常用参数属性:

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

然后每个想要使用这些常用的参数应实现IDynamicParameters接口cmdlet可以返回一个成员实例在MyCommonParameters类:

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

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

通过这种方法,PowerShell命令参数粘结剂将查找并填充在MyCommonParameters实例,就好像他们是CMDL成员的参数et类。

+0

非常酷 - 感谢伯特!我还没有机会尝试这个,但它似乎适合计费。 – pennyowe

相关问题