2016-08-16 6 views
0

C#でPowerShellホストから返されたPSObjectからマップする最も簡単な方法は何ですか?オートマッパーマッピングPowershell PSObject

例プログラム(マイナス実際のマッピング):

class SOResult 
{ 
    public DateTime A { get; set; } 
    public string B { get; set; } 
} 

var script = "@{ A = (Get-Date); B = 'Hello World' };"; 

var instance = PowerShell.Create(); 
instance.AddScript(script); 

var invokeResult = instance.Invoke(); 

var psObject = invokeResult.First(); 

答えて

0

これは私がこれまでに見つけた最高の方法です。キーは、これは、それは非常に簡単ですマッピングし、ハッシュテーブルを返し、PSObjectに.BaseObjectにアクセスすることです:

CreateMap<Hashtable, SOResult>() 
    .ForMember(o => o.A, x => x.MapFrom(f => f["A"])) 
    .ForMember(o => o.B, x => x.MapFrom(f => f["B"])); 

完全な作業プログラム:残念ながら

static void Main(string[] args) 
{ 
    Mapper.Initialize(c => c.AddProfile<SOProfile>()); 

    var script = "@{ A = (Get-Date); B = 'Hello World' };"; 

    var instance = PowerShell.Create(); 
    instance.AddScript(script); 

    var invokeResult = instance.Invoke(); 

    var psObject = invokeResult.First().BaseObject; 

    var soResult = Mapper.Map<SOResult>(psObject); 

    Debug.Assert(soResult != null && !string.IsNullOrWhiteSpace(soResult.B)); 
} 


class SOProfile : Profile 
{ 
    public SOProfile() 
    { 
     CreateMap<Hashtable, SOResult>() 
      .ForMember(o => o.A, x => x.MapFrom(f => f["A"])) 
      .ForMember(o => o.B, x => x.MapFrom(f => f["B"])); 
    } 

} 

あなたは、単純なプロパティが複数ある場合は、このPSObjectからHashtableへの子プロパティを繰り返し変換する必要があるため、苦痛になります。