2016-10-09 6 views
0

Ich arbeite derzeit an einem Projekt Powershell, und ich habe mit Powershell v5 Klassen arbeitet benutzerdefinierte Typen für die Ausgabeobjekte zu erstellen. Aufgrund verschiedener Fehler in der aktuellen Implementierung dieser Klassen habe ich mich jedoch entschieden, stattdessen die Klassen in C# zu erstellen.C# Objekt von Powershell-Objekt

Ich habe auf ein Problem stoßen, dass ich nicht ganz herausfinden kann, wenn der Klassenbauer zu schaffen. Ich arbeite mit PowerShell Invoke-RestMethod und das gibt Objekte vom Typ PSCustomObject zurück. Ich muss die Eigenschaften dieser Objekte verwenden, um Objekte aus C# -Klassen zu instanziieren und einige zusätzliche Eigenschaften zu berechnen. Ein Beispiel Powershell-Konstruktor sah wie folgt aus:

class user 
{ 
    [string] 
    $username 

    [string] 
    $userprincipalname 

    [hashtable] 
    $custom_attributes 

    static [string] getStatus ([int]$Status) 
    { 
     { return [UserStatus]([int]$Status) 
    } 

    static [hashtable] getCustom_Attributes ([PSObject]$custom_attributes) 
    { 
     $Output = @{} 
     $custom_attributes.PSObject.Properties | ForEach-Object { 
      if ($_.Value) {$Output[$_.Name] = $_.Value} 
     } 
     return $Output 
    } 

    User ([PSCustomObject]$InputObject) 
    { 
     $this.username   = $InputObject.username 
     $this.userprincipalname = $InputObject.userprincipalname 
     $this.custom_attributes = [User]::getCustom_Attributes($InputObject.custom_attributes) 
    } 
} 

Jetzt habe ich etwas ähnliches in C# versucht, aber es scheint nicht, dass Sie die Konstruktorparameter Eigenschaften innerhalb des Konstruktors verweisen können:

using System; 
using System.Management.Automation; 
namespace test 
{  
    public class user 
    { 
     public string username {get; set;} 
     public string userprincipalname {get; set;} 
     public object[] custom_attributes {get; set;} 

     static string getStatus (int Status) 
     { 
      return Enum.GetName(typeof(test.userstatus), Status); 
     } 

     user (PSCustomObject InputObject) 
     { 
      this.username   = InputObject.username; 
      this.userprincipalname = InputObject.userprincipalname; 
      this.custom_attribute = test.User.getCustom_Attributes(InputObject.custom_attributes); 
     } 
    } 

    public enum userstatus 
    { 
     Active, 
     Inactive 
    } 
} 

Wenn ich dies mit Add-Type importiere, erhalte ich einen Fehler:

'System.Management.Automation.PSCustomObject' enthält keine Definition für 'Benutzername' und keine Erweiterungsmethode 'Benutzername' akzeptiert ein erstes Argument vom Typ 'System. Management.Automation.PSCustomO bject‘gefunden werden (möglicherweise fehlt eine using-Direktive oder ein assemblyreference?)

Bin ich über dieses völlig falsch gehen? Wie kann ich C# -Objekte von den PSCUstomObjects erstellen und gleichzeitig einige zusätzliche oder Ersatzeigenschaften berechnen? Danke!

+1

Ist dies der eigentliche Code? Schauen Sie sich an, was Sie im Konstruktor haben –

+0

@JeroenVannevel Danke, ja, ich sehe was Sie meinen. Dies ist ähnlich dem tatsächlichen Code, den ich verwende, aber meine Klassen haben auch einige andere Eigenschaften. Sieht so aus, als hätte ich eine falsche Kopie/Paste erstellt und die falschen Eigenschaften in den Konstruktor eingefügt. Dies ist jetzt in der Post oben festgelegt. Dies ist jedoch nicht das Problem, auf das ich stoße, da die tatsächlichen Klassen die richtigen Eigenschaftsnamen haben. –

+0

C# und PowerShell sind sehr unterschiedliche Sprachen. Kurz gesagt, C# funktioniert nicht so und PowerShells Klassen sind eher ein nachträglicher Einfall. Das C# -Equivalent zu dem, was PowerShell mit Objekten macht, ist 'ExpandoObject' und' dynamic', aber das ist wahrscheinlich nicht das, wonach Sie suchen. Das Übergeben einer 'Hashtable' an den Konstruktor ist logischer. –

Antwort

0

Ich kam um auf eine einfachere Lösung, die ich meine Bedürfnisse glauben erfüllt. Statt auf Konstrukteure verlassen, ich bin mit benutzerdefinierten Getter meine berechneten Eigenschaften zu erstellen:

public class User 
{ 
    public string username {get; set;} 
    public string userprincipalname {get; set;} 
    public string status {get; set;} 
    public string status_value 
    { 
     get 
     { 
      return Enum.GetName(typeof(UserStatus), Int32.Parse(this.status)); 
     } 
    } 
} 

Bisher diese Arbeit zu sein scheint, und ich habe ganz allein meine Konstrukteure verlassen und bin nur den Standard-Konstruktor. Ich glaube, ich könnte immer noch einen Konstruktor mit diesen verwenden und das gleiche Ergebnis von den Gettern erhalten.

Danke für Ihre Hilfe, alle!