У меня есть структура данных, состоящая из двух классов:
//--------------------------------------------------------
// 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/vyRddvj.png. В вашем случае я предполагаю, что это фактический класс Person
, когда ToString()
по умолчанию имеет свойство Id
. Пожалуйста, подтвердите, так ли это
Если я расширяю деятельность, то вижу объекты человека, как вы описываете. Под этим я подразумеваю (Get-Activities).participants возвращает объект person. Однако, если я просто использую Get-Activities, участники просто отображаются как идентификатор.
И если да, то (Get-Activities).participants[0].ToString()
получите ли вы идентификатор или имя?
Нет, я получаю имя своего класса thepeskyexternalclasses.person.
В качестве дополнения к вашему вопросу и полезному ответу от @SantiagoSquarzon вы даже можете определить собственное представление по требованию, например: participants: {1:Susan, 2:Frank, 4:Jeff}
, посмотрите этот полезный ответ от mklement0.
@SantiagoSquarzon, вы правы: у моей модели есть свойство с именем username, а не свойство с именем name. Ваше решение установить имя свойства по умолчанию привело к тому, что свойство имени пользователя стало значением по умолчанию. В качестве продолжения. может ли свойство отображения по умолчанию быть установлено самим командлетом?
@WilliamHolmes, конечно, есть, вы можете добавить static
ctor и запустить тот же код, используя экземпляр PowerShell
. Пожалуйста, задайте новый вопрос, я покажу вам, как
Предположительно, реальный тип 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}
Разве не так вы видите объекты? i.imgur.com/VrpJLRU.png не могу воспроизвести