2016-08-16 4 views
0

Was ist die einfachste Methode zum Zuordnen von einem PSObject, das von einem PowerShell-Host in C# zurückgegeben wird?Automapper Mapping Powershell PSObject

Beispielprogramm (minus die tatsächliche Abbildung):

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

Antwort

0

Dies ist die beste Methode, die ich bisher gefunden habe. Der Schlüssel ist .BaseObject auf dem PSObject zuzugreifen, diese eine Hashtable zurückgibt, dann Abbilden es ist ziemlich einfach:

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

komplette Arbeitsprogramm:

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

} 

Leider, wenn Sie mehr als nur einfache Eigenschaften haben diese Das wird schmerzhaft, weil Sie die untergeordneten Eigenschaften von PSObject wiederholt in Hashtable konvertieren müssen.