2016-10-09 2 views
0

В настоящее время я работаю над проектом 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, а также иметь возможность вычислять некоторые дополнительные или заменяющие свойства? Спасибо!

+1

Это настоящий код? Посмотрите, что у вас есть в конструкторе –

+0

@JeroenVannevel Спасибо, да, я понимаю, о чем вы говорите. Это похоже на фактический код, который я использую, но мои классы также имеют несколько других свойств. Похоже, я сделал плохую копию/вставку и включил неправильные свойства в конструктор. Это зафиксировано в сообщении выше. Однако на самом деле это не проблема, с которой я сталкиваюсь, поскольку фактические классы имеют правильные имена свойств. –

+0

C# и PowerShell - очень разные языки. Короче говоря, C# не работает таким образом, а классы PowerShell более поздние. C#, эквивалентный тому, что PowerShell делает с объектами, это 'ExpandoObject' и' dynamic', но это, вероятно, не то, что вы ищете. Более логичным является передача «Hashtable» в конструктор. –

ответ

0

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

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)); 
     } 
    } 
} 

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

Спасибо за помощь, все!

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