2012-06-28 26 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

相關問題