2012-06-28 10 views
7

Al exponer un conjunto de funciones relacionadas en los cmdlets de Powershell, ¿es posible compartir los nombres de las propiedades y la ayuda resumida para normalizarlas en los cmdlets de un ensamblaje?¿Es posible compartir propiedades y comentarios entre los cmdlets de Powershell en C#?

Sé que esto se puede hacer con clases derivadas, pero esta solución es incómoda en el mejor de los casos cuando hay varios cmdlets con diferentes propiedades para compartir.

Aquí hay un ejemplo extremadamente simple. Me gustaría compartir la propiedad 'Nombre' y todos los comentarios relacionados para que sean los mismos en los N cmdlets que estamos produciendo, pero no puedo pensar en una buena manera de hacerlo en C#. Idealmente, cualquier intercambio permitiría la especificación de atributos de Parámetros tales como Mandatory o 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 
    } 
} 
} 
+0

Si no desea derivar (no tengo claro el motivo), la mejor forma de compartir comentarios es utilizar XML includes (consulte el código fuente del framework). Mantiene la documentación del código fuera de su código, puede ser escrita y mantenida (si es necesario) por otra persona y puede compartirse entre clases e incluso ensamblajes. –

+0

@Adriano Gracias por la idea de compartir comentarios a través de XML incluye. El razonamiento detrás de no querer derivar es que es posible hacerlo limpiamente. Si el cmdlet A usa P1, P2, mientras que el cmdlet B usa P2, P3 y el cmdlet C usa P1, P3, no hay forma de derivar y compartir P1, P2, P3 como se desee. También me doy cuenta de que mi idea de compartir estas propiedades puede no estar bien fundada. Simplemente se ha convertido en una molestia actualizar los N lugares cada vez que algo cambia y ciertamente odio copiar y pegar el código. – pennyowe

+0

¡Oh, entonces tienes razón! Solo pensé que tenían muchas propiedades compartidas. La única forma en que pienso hacerlo es a través de incluir (pero está bien solo para comentarios). Algún día (tal vez ...) tendremos herencia múltiple ... –

Respuesta

3

Sí, hay una forma de hacerlo sin heredar de una clase base común para los parámetros. No está bien documentado, solo se insinuó en las observaciones del método IDynamicParameters.GetDynamicParameters. Aquí hay un tratamiento más detallado del tema.

primer lugar, crear una clase con sus parámetros comunes declarados como propiedades con el [parámetros] atributos:

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

Luego, cada cmdlet que quiere utilizar estos parámetros comunes deben implementar la interfaz IDynamicParameters para devolver una instancia de miembro de la clase MyCommonParameters:

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

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

Con este enfoque, el aglutinante de parámetros del sistema de PowerShell encontrará y rellenar los parámetros de la instancia MyCommonParameters simplemente como si fueran miembros de la CMDL et clases.

+0

Muy bueno, gracias Burt! Todavía no he tenido la oportunidad de probar esto, pero parece que se ajustará a la facturación. – pennyowe

Cuestiones relacionadas