首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动映射Powershell PSObject

自动映射Powershell PSObject
EN

Stack Overflow用户
提问于 2016-08-16 16:01:14
回答 1查看 458关注 0票数 1

在C#中,从PowerShell主机返回的PSObject映射最简单的方法是什么?

示例程序(减去实际映射):

代码语言:javascript
复制
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();
EN

回答 1

Stack Overflow用户

发布于 2016-08-16 16:01:14

这是到目前为止我发现的最好的方法。关键是在PSObject上访问.BaseObject,这将返回一个哈希表,然后映射它非常简单:

代码语言:javascript
复制
CreateMap<Hashtable, SOResult>()
    .ForMember(o => o.A, x => x.MapFrom(f => f["A"]))
    .ForMember(o => o.B, x => x.MapFrom(f => f["B"]));

完整的工作计划:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38969525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档