在C#中,从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();发布于 2016-08-16 16:01:14
这是到目前为止我发现的最好的方法。关键是在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。
https://stackoverflow.com/questions/38969525
复制相似问题