2012-06-28 6 views
7

Wenn eine Reihe verwandter Funktionen in Powershell-Cmdlets verfügbar gemacht wird, ist es möglich, die Eigenschaftennamen und die Zusammenfassungshilfe für die Normalisierung dieser Cmdlets in einer Assembly zu verwenden?Ist es möglich, Eigenschaften und Kommentare zwischen PowerShell-Cmdlets in C# zu teilen?

Ich weiß, dass dies mit abgeleiteten Klassen getan werden kann, aber diese Lösung ist bestenfalls umständlich, wenn mehrere Cmdlets mit unterschiedlichen Eigenschaften geteilt werden.

Hier ist ein sehr einfaches Beispiel. Ich möchte die Eigenschaft 'Name' und alle zugehörigen Kommentare teilen, damit sie für alle N Cmdlets, die wir produzieren, identisch sind, aber ich kann mir keinen guten Weg vorstellen, dies in C# zu tun. Im Idealfall würde jede gemeinsame Verwendung die Spezifikation von Parameterattributen wie Mandatory oder Position ermöglichen.

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

Wenn Sie nicht ableiten wollen (ich bin nicht klar über den Grund) ist der beste Weg, Kommentare zu teilen, XML-Includes zu verwenden (siehe Framework-Quellcode). Sie halten die Codedokumentation außerhalb Ihres Codes, sie kann (falls benötigt) von jemand anderem geschrieben und gepflegt werden und sie kann über Klassen und sogar Assemblys hinweg geteilt werden. –

+0

@Adriano Danke für die Idee, Kommentare über XML-Includes zu teilen. Der Grund dafür, nicht ableiten zu wollen, ist, dass es möglich ist, sauber zu machen. Wenn Cmdlet A P1, P2 verwendet, während Cmdlet B P2, P3 verwendet und Cmdlet C P1, P3 verwendet, gibt es keine Möglichkeit, P1, P2, P3 wie gewünscht abzuleiten und zu teilen. Mir ist auch klar, dass meine Idee, diese Eigenschaften zu teilen, nicht gut begründet ist. Es ist nur mühsam geworden, die N Orte zu aktualisieren, wenn sich etwas ändert, und ich hasse wirklich Code und eingefügten Code. – pennyowe

+0

Oh, dann hast du Recht! Ich dachte nur, sie hätten viele gemeinsame Eigenschaften. Nur denke ich, es zu tun ist über include (aber es ist nur OK für Kommentare). Eines Tages (vielleicht ...) haben wir mehrere Vererbung ... –

Antwort

3

Ja, es gibt eine Möglichkeit, dies zu tun, ohne von einer gemeinsamen Basisklasse für die Parameter zu erben. Es ist nicht gut dokumentiert, nur angedeutet in den IDynamicParameters.GetDynamicParameters Bemerkungen. Hier ist eine detailliertere Behandlung des Themas.

zunächst eine Klasse mit Ihren gemeinsamen Parameter als Eigenschaften mit dem [Parameter] erklärt erstellen Attribute:

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

Dann wird jedes Cmdlets, die diese gemeinsame Parameter verwenden möchte, sollte die IDynamicParameters Schnittstelle implementieren ein Mitglied Instanz zurückzugeben die MyCommonParameters Klasse:

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

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

Mit diesem Ansatz wird der Powershell-Befehlsparameter Bindemittel finden und die Parameter auf der MyCommonParameters Instanz bevölkert, als ob sie Mitglieder der CMDL waren et Klassen.

+0

Sehr cool - danke Burt! Ich hatte noch keine Gelegenheit, dies zu versuchen, aber es scheint, dass es zur Abrechnung passt. – pennyowe

Verwandte Themen