1

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

1 に答える 1

0

これは私がこれまでに見つけた最良の方法です。.BaseObject重要なのは、PSObjectにアクセスすることです。これは Hashtable を返します。マッピングは非常に簡単です。

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 に繰り返し変換する必要があるため、これは苦痛になります。

于 2016-08-16T08:01:14.320 に答える