如何在PowerShell自定义PSObject上使用GetType().GetProperties()?

And*_*der 1 reflection powershell log4net psobject

我试图让这个log4net自定义与PowerShell PSObjects一起使用.基本上,此模式布局将遍历对象并将其属性转储到CSV列中.以下是执行反射的代码:

PropertyInfo[] properties = loggingEvent.MessageObject.GetType().GetProperties();
            foreach (PropertyInfo prop in properties)
            {
                object value = prop.GetValue(loggingEvent.MessageObject, null);
                loggingEvent.Properties[prop.Name] = value;
            }
Run Code Online (Sandbox Code Playgroud)

这在C#中使用普通类时工作正常.如果我在PowerShell中使用内联C#创建一个类,它也可以工作.

$code = @”

using System;
namespace CsvTest { 
    public class MyEvent
        {
            public string UserId { get; set; }
            public string Details { get; set; }
            public int EventCode { get; set; }

        }
    }
“@

Add-Type $code

$test = New-Object CsvTest.MyEvent
$test.UserId = "Andy"
$test.Details ="SomeStuff"
$test.EventCode = 10

$MyCommonLogger.Error($test)
$MyCommonLogger.Info($test)
$MyCommonLogger.Warn($test)
Run Code Online (Sandbox Code Playgroud)

如果我创建一个自定义PSObject,那么什么是行不通的.如果我用PSCustom对象替换$代码,如

$obj = New-Object psobject -Property @{
                        "UserId" = "Andy";
                        "EventCode" = 100;
                        "Details" = "DetailInfoGoeshere"
                        }
Run Code Online (Sandbox Code Playgroud)

然后它将返回Null.我已经确认这确实会返回null.

$obj = New-Object psobject -Property @{
                        "UserId" = "Andy";
                        "EventCode" = 100;
                        "Details" = "DetailInfoGoeshere"
                        }

$obj.GetType().GetProperties()
Run Code Online (Sandbox Code Playgroud)

我想我可以破解CSVLogging Pattern布局,并在入站对象是PSObject的情况下创建一个特例,但我不必为一种类型的对象自定义它.在PowerShell中是否有一种方法可以使用psobject并将其转换/转换为可以与GetType()一起使用的东西.GetProperties()?

JPB*_*anc 5

据我了解,根据以下结果:

Get-Member -InputObject $obj -Force
Run Code Online (Sandbox Code Playgroud)

获取psObject属性的方法是:

$obj.psobject.properties
$obj.psobject.get_properties()
Run Code Online (Sandbox Code Playgroud)

难道你不能编写动态创建类的C#代码吗?