2012-06-28 11 views
7

Quando si espone un set di funzioni correlate nei cmdlet di PowerShell, è possibile condividere i nomi di proprietà e la guida di riepilogo per normalizzarli attraverso cmdlet in un assembly?È possibile condividere proprietà e commenti tra i cmdlet di PowerShell in C#?

So che questo può essere fatto con le classi derivate, ma questa soluzione è scomoda al meglio quando ci sono più cmdlet con proprietà differenti da condividere.

Ecco un esempio estremamente semplice. Mi piacerebbe condividere la proprietà 'Nome' e tutti i commenti correlati in modo che siano uguali tra i cmdlet N che produciamo, ma non riesco a pensare a un buon modo per farlo in C#. Idealmente, qualsiasi condivisione consentirebbe la specifica degli attributi del parametro come Obbligatorio o Posizione.

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

Se non si vuole derivare (non sono chiari sul motivo) il modo migliore per condividere i commenti è usare XML include (guarda il codice sorgente del framework). La documentazione del codice viene mantenuta al di fuori del codice, può essere scritta e gestita (se necessario) da qualcun altro e può essere condivisa tra classi e persino assiemi. –

+0

@Adriano Grazie per l'idea di guardare i commenti di condivisione tramite XML include. Il ragionamento dietro non voler derivare è che è possibile fare in modo pulito. Se il cmdlet A utilizza P1, P2 mentre il cmdlet B usa P2, P3 e cmdlet C utilizza P1, P3 non è possibile derivare e condividere P1, P2, P3 come desiderato. Mi rendo anche conto che la mia idea di condividere queste proprietà potrebbe non essere ben fondata. È appena diventato una seccatura aggiornare i punti N ogni volta che qualcosa cambia e sono sicuro che odio copiare e incollare il codice. – pennyowe

+0

Oh, allora hai ragione! Ho solo pensato che avessero molte proprietà condivise. L'unico modo in cui penso di farlo è tramite include (ma va bene solo per i commenti). Un giorno (forse ...) avremo un'eredità multipla ... –

risposta

3

Sì, c'è un modo per farlo senza ereditare da una classe base comune per i parametri. Non è ben documentato, solo suggerito nelle osservazioni del metodo IDynamicParameters.GetDynamicParameters. Ecco un trattamento più dettagliato dell'argomento.

In primo luogo, creare una classe con i tuoi parametri comuni dichiarati come proprietà con il [Parametro] attributi:

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

Poi ogni Cmdlet che vuole utilizzare questi parametri comuni devono implementare l'interfaccia IDynamicParameters per tornare un'istanza membro della classe MyCommonParameters:

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

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

Con questo approccio, il parametro di comando PowerShell legante troverà e popolare i parametri nell'istanza MyCommonParameters proprio come se fossero membri della CMDL et classi.

+0

Molto bello - grazie Burt! Non ho ancora avuto la possibilità di provarlo ma sembra che si adatti alla fatturazione. – pennyowe

Problemi correlati