2016-10-09 4 views
0

現在PowerShellプロジェクトを作成中です。PowerShell v5クラスを使用して、出力オブジェクトのカスタムタイプを作成しています。しかし、これらのクラスの現在の実装のさまざまな失敗のために、私は代わりにC#でクラスを作成してみることにしました。C#Object from PowerShellオブジェクト

私は、クラスコンストラクタの作成時には分かりませんが、問題が発生しました。私はPowerShellのInvoke-RestMethodを使っています。これは、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'の定義がなく、 'System'タイプの最初の引数を受け入れる拡張メソッド 'username'がありません。 Management.Automation.PSCustomO bject 'が見つかりました(使用しているディレクティブやアセンブリ参照がありませんか?)

私はこれについて完全に間違っていますか?どのようにして、PSCUstomObjectsからC#オブジェクトを作成することができますが、いくつかの追加または置換プロパティを計算する能力もありますか? ありがとう!

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

これまでのところ、これは働いているように見える、と私は完全に私のコンストラクタを放棄してきたし、ちょうどデフォルトのコンストラクタを使用しています。私はまだこれらのコンストラクタを使用し、getterから同じ結果を得ることができると信じています。

ご協力ありがとうございます。