2012-06-28 2 views
7

Если вы раскрываете набор связанных функций в командлетах Powershell, можно ли обмениваться именами свойств и сводной справкой для нормализации этих командлетов в сборке?Можно ли делиться свойствами и комментариями между командлетами Powershell в C#?

Я знаю, что это можно сделать с производными классами, но это решение в лучшем случае неудобно, когда есть несколько командлетов с разными свойствами, которые будут использоваться совместно.

Вот очень простой пример. Я хотел бы поделиться свойством «Имя» и всеми связанными комментариями, чтобы они были одинаковыми для всех командлетов N, которые мы производим, но я не могу придумать хороший способ сделать это в 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; } 
    ... 
} 

Тогда каждый Cmdlet что хочет использовать эти общие параметры должны реализовывать интерфейс IDynamicParameters вернуть экземпляр члена класса 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 classes.

+0

Очень круто - спасибо Берт! У меня еще не было возможности попробовать это, но похоже, что он будет соответствовать выставлению счетов. – pennyowe

 Смежные вопросы

  • Нет связанных вопросов^_^