2012-06-28 7 views
7

Khi phơi bày một tập hợp các hàm liên quan trong lệnh ghép ngắn Powershell, có thể chia sẻ tên thuộc tính và tóm tắt giúp bình thường hóa các lệnh ghép ngắn này trong một assembly không?Có thể chia sẻ các thuộc tính và nhận xét giữa các lệnh ghép ngắn Powershell trong C# không?

Tôi biết rằng điều này có thể được thực hiện với các lớp dẫn xuất, nhưng giải pháp này là khó xử nhất khi có nhiều lệnh ghép ngắn với các thuộc tính khác nhau được chia sẻ.

Đây là một ví dụ cực kỳ đơn giản. Tôi muốn chia sẻ thuộc tính 'Name' và tất cả các bình luận liên quan để chúng giống nhau trên các lệnh ghép ngắn N mà chúng ta đang tạo ra, nhưng tôi không thể nghĩ ra cách tốt để làm điều này trong C#. Lý tưởng nhất là chia sẻ bất kỳ sẽ cho phép đặc điểm kỹ thuật của các thuộc tính tham số như bắt buộc hoặc vị trí.

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

Nếu bạn không muốn lấy được (tôi không rõ ràng về lý do) cách tốt nhất để chia sẻ nhận xét là sử dụng XML bao gồm (xem mã nguồn khung). Bạn giữ tài liệu mã bên ngoài mã của bạn, nó có thể được viết và duy trì (nếu cần) bởi người khác và nó có thể được chia sẻ giữa các lớp và thậm chí cả các hội đồng. –

+0

@Adriano Cảm ơn ý tưởng xem xét chia sẻ nhận xét qua XML bao gồm. Lý do đằng sau không muốn lấy được là nó có thể làm sạch. Nếu lệnh ghép ngắn A sử dụng P1, P2 trong khi lệnh ghép ngắn B sử dụng P2, P3 và cmdlet C sử dụng P1, P3 thì không có cách nào để lấy và chia sẻ P1, P2, P3 như mong muốn. Tôi cũng nhận ra rằng ý tưởng chia sẻ các đặc tính này có thể không được thành lập tốt. Nó vừa trở thành một rắc rối để cập nhật N nơi bất cứ khi nào một cái gì đó thay đổi và tôi chắc chắn làm ghét sao chép và dán mã. – pennyowe

+0

Ồ, sau đó bạn đã đúng! Tôi chỉ nghĩ rằng họ có nhiều tài sản chung. Cách duy nhất tôi nghĩ để làm điều đó là thông qua bao gồm (nhưng nó chỉ OK cho ý kiến). Một ngày nào đó (có thể ...) chúng ta sẽ có nhiều thừa kế ... –

Trả lời

3

Có, có cách để thực hiện việc này mà không kế thừa từ lớp cơ sở chung cho tham số. Nó không được ghi chép đầy đủ, chỉ ám chỉ trong các nhận xét của phương pháp IDynamicParameters.GetDynamicParameters. Đây là một điều trị chi tiết hơn về chủ đề này.

Đầu tiên, tạo một lớp học với các thông số chung của bạn khai báo là khách sạn với [Parameter] thuộc tính:

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

Sau đó, mỗi Cmdlet mà muốn sử dụng các thông số chung nên thực hiện các giao diện IDynamicParameters trở về một trường hợp thành viên của lớp MyCommonParameters:

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

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

với phương pháp này, các tham số PowerShell lệnh binder sẽ tìm và cư các thông số trên dụ MyCommonParameters cũng giống như khi họ là thành viên của Cmdl et lớp học.

+0

Rất tuyệt - cảm ơn Burt! Tôi chưa có cơ hội để thử điều này nhưng có vẻ như nó sẽ phù hợp với việc thanh toán. – pennyowe