Расширение Powershell C# Как выбрать свойство по умолчанию для отображения из вложенного свойства. Это список объектов

У меня есть структура данных, состоящая из двух классов:

//--------------------------------------------------------
// These classes are external to the powershell extension
//
namespace thosepeskyexternalclasses
{
    public class person
    {
        public int Id {get; set}
        public string Name {get;set;}
    }

    public class activity 
    {
        public int Id {get; set;}
        public string activityName {get; set;}
        public List<person> participants {get ; set;}
    }
}

В библиотеке классов также есть функция GetActivities(), которая возвращает список действий.

Затем у меня есть следующее расширение C# PowerShell:

//-----------------------------------------------------
// This is the powershell extension
using System.Management.Automation;
using thosepeskyexternalclasses

[Cmdlet(VerbsCommon.Get, "Activities", SupportsTransactions = false)]
public class GetActivity : PSCmdlet
{
    protected override void ProcessRecord()
    {
        base.ProcessRecord();
        // Get the activities
        List<activity> activities = GetActivities();

        WriteObject(activities);

    }
}

После сборки и загрузки модуля доступен командлет Get-Activities, который при вызове возвращает список действий. Однако список участников каждого действия отображается с использованием свойства Id, а не свойства Name.

Я понимаю использование PSStandardMembers, поскольку оно применимо к списку действий, но не понимаю, как я буду применять его к участникам.

Например, если я вызову Get-Activities, возвращаемые объекты будут выглядеть так:

Id : 1
activityname: golf
participants: {1, 2, 4}

Я хотел бы иметь:

Id : 1
activityname: golf
participants: {Susan, Frank, Jeff}

В качестве ограничения я не могу изменять модель или классы.

Разве не так вы видите объекты? i.imgur.com/VrpJLRU.png не могу воспроизвести

Santiago Squarzon 05.08.2024 22:34

лучший скриншот: i.imgur.com/vyRddvj.png. В вашем случае я предполагаю, что это фактический класс Person, когда ToString() по умолчанию имеет свойство Id. Пожалуйста, подтвердите, так ли это

Santiago Squarzon 05.08.2024 22:44

Если я расширяю деятельность, то вижу объекты человека, как вы описываете. Под этим я подразумеваю (Get-Activities).participants возвращает объект person. Однако, если я просто использую Get-Activities, участники просто отображаются как идентификатор.

William Holmes 05.08.2024 23:09

И если да, то (Get-Activities).participants[0].ToString() получите ли вы идентификатор или имя?

Santiago Squarzon 05.08.2024 23:15

Нет, я получаю имя своего класса thepeskyexternalclasses.person.

William Holmes 05.08.2024 23:26

В качестве дополнения к вашему вопросу и полезному ответу от @SantiagoSquarzon вы даже можете определить собственное представление по требованию, например: participants: {1:Susan, 2:Frank, 4:Jeff}, посмотрите этот полезный ответ от mklement0.

iRon 06.08.2024 08:25

@SantiagoSquarzon, вы правы: у моей модели есть свойство с именем username, а не свойство с именем name. Ваше решение установить имя свойства по умолчанию привело к тому, что свойство имени пользователя стало значением по умолчанию. В качестве продолжения. может ли свойство отображения по умолчанию быть установлено самим командлетом?

William Holmes 06.08.2024 14:41

@WilliamHolmes, конечно, есть, вы можете добавить static ctor и запустить тот же код, используя экземпляр PowerShell. Пожалуйста, задайте новый вопрос, я покажу вам, как

Santiago Squarzon 06.08.2024 15:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предположительно, реальный тип person не имеет свойства .Name, поскольку в противном случае эту проблему нельзя будет воспроизвести, PowerShell должен выбрать свойство с именем Name и использовать его как свойство по умолчанию для отображения. Однако простой способ определить, какое свойство объекта вы хотите отображать по умолчанию, — использовать Update-TypeData с параметром -DefaultDisplayProperty

Update-TypeData -TypeName thosepeskyexternalclasses.person -DefaultDisplayProperty Name

Используя это определение класса PowerShell в качестве примера:

class Test {
    [int] $id
    [string] $otherprop
}

$testObject = @{
    test = @(
        [Test]@{ id = 1; otherprop = 'foo' }
        [Test]@{ id = 2; otherprop = 'bar' }
    )
}

Без свойства отображения по умолчанию:

PS /> $testObject

# Name                           Value
# ----                           -----
# test                           {1, 2}

Со свойством отображения по умолчанию:

PS /> Update-TypeData -TypeName Test -DefaultDisplayProperty otherprop
PS /> $testObject

# Name                           Value
# ----                           -----
# test                           {foo, bar}

Другие вопросы по теме