我正在尝试让this log4net customization与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;
}
在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)
如果我创建了自定义PSObject,那是行不通的。如果我将$ code替换为PSCustom对象,例如
$obj = New-Object psobject -Property @{
"UserId" = "Andy";
"EventCode" = 100;
"Details" = "DetailInfoGoeshere"
}
然后它将仅返回Null。我已验证这确实返回null。
$obj = New-Object psobject -Property @{
"UserId" = "Andy";
"EventCode" = 100;
"Details" = "DetailInfoGoeshere"
}
$obj.GetType().GetProperties()
我想我可以破解CSVLogging Pattern布局,并在入站对象是PSObject的情况下做一个特例,但我宁愿不必仅针对一种类型的对象对其进行自定义。在PowerShell中,有没有一种方法可以将psobject转换为我可以与GetType()。GetProperties()一起使用的对象?
最佳答案
据我了解,根据的结果:
Get-Member -InputObject $obj -Force
获取psObject属性的方法是:
$obj.psobject.properties
$obj.psobject.get_properties()
您不能编写动态创建类的C#代码吗?