如何使用 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;
    }
}