如何使用 C# 在 .NET 中访问 PSObject DefaultKeyPropertySet 详细信息
How to access PSObject DefaultKeyPropertySet details in .NET with C#
我正在尝试在 C# 中实现一个 cmdlet,它使用 PSStandardMembers.DefaultKeyPropertySet.ReferencedPropertyNames 集合基于 PSObject 的 属性 值构建单个字符串键。
虽然我可以在 PowerShell 中以如下方式执行此操作:
param($ObjectArray)
$TypeName = $ObjectArray[0].PSObject.TypeNames[0]
$KeyProperty = $ObjectArray[0].PSStandardMembers.DefaultKeyPropertySet.ReferencedPropertyNames
for ($i=0; $i -lt $ObjectArray.Count; ++$i) {
$O = $ObjectArray[$i]
$KeyValue = $O.PSObject.Properties[$KeyProperty].Value -replace ':','::' -replace ';',';;' -replace ',',',,' -join ','
$KeyValueString = $KeyValue -join ','
"K;${script:scope};Object::${TypeName};${KeyValueString}"
}
我想在 C# 中更直接地实现一些东西,因为我发现,就我的目的而言,通过本机 PowerShell 函数调用上面的内容开销太大。
我无法理解如何在 C# 中获取引用的 属性 名称。以下内容似乎适合获取正确的成员集合,但不清楚如何从 PSMemberInfoCollection 的正确项目中获取默认键 属性 集或引用的 属性 名称。
假设下面的 objectList 是一个 PSObject 数组,并且我希望将 referencedPropertyNames 指定为对对象默认键属性名称的引用。目前还不清楚我如何通过 PSStandardMembers 进行分配。
foreach (PSObject current in objectList)
{
//
referencedPropertyNames = current.Members["PSStandardMembers"];
求助。
感谢 GitHub 上的 PowerShell 开源项目。不出所料,答案可以在 Sort-Object 的源代码中找到。我会 post 在这里 post 诚实。
internal static string[] GetDefaultKeyPropertySet(PSObject mshObj)
{
PSMemberSet standardNames = mshObj.PSStandardMembers;
if (standardNames == null)
{
return null;
}
PSPropertySet defaultKeys = standardNames.Members["DefaultKeyPropertySet"] as PSPropertySet;
if (defaultKeys == null)
{
return null;
}
string[] props = new string[defaultKeys.ReferencedPropertyNames.Count];
defaultKeys.ReferencedPropertyNames.CopyTo(props, 0);
return props;
}
见the helper function for the Sort-Object and Group-Object Cmdlets
PSStandardMembers 和 GetDefaultKeyPropertySet 似乎是 class 的内部成员,因此用户代码无法访问。这意味着它们不应由外部组件使用,但很明显它们可以直接在 PowerShell 中使用。
一个解决方案似乎是:
public static class Utility
{
private static string[] GetDefaultKeyPropertySet(PSObject mshObj)
{
PSMemberSet standardNames = mshObj.Members["PSStandardMembers"] as PSMemberSet;
if (standardNames == null)
{
return null;
}
PSPropertySet defaultKeys = standardNames.Members["DefaultKeyPropertySet"] as PSPropertySet;
if (defaultKeys == null)
{
return null;
}
string[] props = new string[defaultKeys.ReferencedPropertyNames.Count];
defaultKeys.ReferencedPropertyNames.CopyTo(props, 0);
return props;
}
}
我正在尝试在 C# 中实现一个 cmdlet,它使用 PSStandardMembers.DefaultKeyPropertySet.ReferencedPropertyNames 集合基于 PSObject 的 属性 值构建单个字符串键。
虽然我可以在 PowerShell 中以如下方式执行此操作:
param($ObjectArray)
$TypeName = $ObjectArray[0].PSObject.TypeNames[0]
$KeyProperty = $ObjectArray[0].PSStandardMembers.DefaultKeyPropertySet.ReferencedPropertyNames
for ($i=0; $i -lt $ObjectArray.Count; ++$i) {
$O = $ObjectArray[$i]
$KeyValue = $O.PSObject.Properties[$KeyProperty].Value -replace ':','::' -replace ';',';;' -replace ',',',,' -join ','
$KeyValueString = $KeyValue -join ','
"K;${script:scope};Object::${TypeName};${KeyValueString}"
}
我想在 C# 中更直接地实现一些东西,因为我发现,就我的目的而言,通过本机 PowerShell 函数调用上面的内容开销太大。
我无法理解如何在 C# 中获取引用的 属性 名称。以下内容似乎适合获取正确的成员集合,但不清楚如何从 PSMemberInfoCollection 的正确项目中获取默认键 属性 集或引用的 属性 名称。
假设下面的 objectList 是一个 PSObject 数组,并且我希望将 referencedPropertyNames 指定为对对象默认键属性名称的引用。目前还不清楚我如何通过 PSStandardMembers 进行分配。
foreach (PSObject current in objectList)
{
//
referencedPropertyNames = current.Members["PSStandardMembers"];
求助。
感谢 GitHub 上的 PowerShell 开源项目。不出所料,答案可以在 Sort-Object 的源代码中找到。我会 post 在这里 post 诚实。
internal static string[] GetDefaultKeyPropertySet(PSObject mshObj)
{
PSMemberSet standardNames = mshObj.PSStandardMembers;
if (standardNames == null)
{
return null;
}
PSPropertySet defaultKeys = standardNames.Members["DefaultKeyPropertySet"] as PSPropertySet;
if (defaultKeys == null)
{
return null;
}
string[] props = new string[defaultKeys.ReferencedPropertyNames.Count];
defaultKeys.ReferencedPropertyNames.CopyTo(props, 0);
return props;
}
见the helper function for the Sort-Object and Group-Object Cmdlets
PSStandardMembers 和 GetDefaultKeyPropertySet 似乎是 class 的内部成员,因此用户代码无法访问。这意味着它们不应由外部组件使用,但很明显它们可以直接在 PowerShell 中使用。
一个解决方案似乎是:
public static class Utility
{
private static string[] GetDefaultKeyPropertySet(PSObject mshObj)
{
PSMemberSet standardNames = mshObj.Members["PSStandardMembers"] as PSMemberSet;
if (standardNames == null)
{
return null;
}
PSPropertySet defaultKeys = standardNames.Members["DefaultKeyPropertySet"] as PSPropertySet;
if (defaultKeys == null)
{
return null;
}
string[] props = new string[defaultKeys.ReferencedPropertyNames.Count];
defaultKeys.ReferencedPropertyNames.CopyTo(props, 0);
return props;
}
}