【发布时间】:2013-09-01 19:35:13
【问题描述】:
我正在尝试让 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()
如果入站对象是 PSObject,我想我可以破解 CSVLogging 模式布局并制作一个特殊情况,但我宁愿不必仅为一种类型的对象自定义它。 PowerShell 中有没有办法获取一个 psobject 并将其隐藏/转换为我可以与 GetType().GetProperties() 一起使用的东西?
【问题讨论】:
-
什么版本的powershell,安迪?
-
Windows 8 上的 PowerShell v3
标签: powershell reflection log4net psobject