В настоящее время я работаю над проектом PowerShell, и я работал с классами PowerShell v5 для создания пользовательских типов для выходных объектов. Однако из-за различных сбоев в текущей реализации этих классов я решил попробовать создать классы на C#.Объект C# объекта PowerShell
У меня возникла проблема, которую я не могу понять при создании конструкторов классов. Я работаю с Invoke-RestMethod PowerShell, и это возвращает объекты типа PSCustomObject. Мне нужно использовать свойства этих объектов для создания объектов из классов C#, а также для вычисления некоторых дополнительных свойств. Пример PowerShell конструктор выглядит следующим образом:
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)
}
}
Теперь я пытался что-то подобное в C#, но это не кажется, что вы можете ссылаться на свойства параметра конструктора внутри конструктора:
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
}
}
Когда я импортирую это с помощью Add-Type, я получаю сообщение об ошибке:
«System.Management.Automation.PSCustomObject» не содержит определения для «username» и не имеет никакого имени «имя пользователя», принимающего первый аргумент типа «Система». Management.Automation.PSCustomO bject "(вы не указали директиву использования или ссылку на сборку?)
Неужели я об этом совершенно не так? Как я могу создавать объекты C# из объектов PSCUstomObjects, а также иметь возможность вычислять некоторые дополнительные или заменяющие свойства? Спасибо!
Это настоящий код? Посмотрите, что у вас есть в конструкторе –
@JeroenVannevel Спасибо, да, я понимаю, о чем вы говорите. Это похоже на фактический код, который я использую, но мои классы также имеют несколько других свойств. Похоже, я сделал плохую копию/вставку и включил неправильные свойства в конструктор. Это зафиксировано в сообщении выше. Однако на самом деле это не проблема, с которой я сталкиваюсь, поскольку фактические классы имеют правильные имена свойств. –
C# и PowerShell - очень разные языки. Короче говоря, C# не работает таким образом, а классы PowerShell более поздние. C#, эквивалентный тому, что PowerShell делает с объектами, это 'ExpandoObject' и' dynamic', но это, вероятно, не то, что вы ищете. Более логичным является передача «Hashtable» в конструктор. –