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()?
据我了解,根据以下结果:
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#代码吗?
| 归档时间: |
|
| 查看次数: |
6110 次 |
| 最近记录: |