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!
Ist dies der eigentliche Code? Schauen Sie sich an, was Sie im Konstruktor haben –
@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. –
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. –