Как динамически определить класс в C # PowerShell Cmdlet

У меня есть данные, которые я получаю из источника данных, который представляет собой набор пар имя / значение, которые я храню в Dictionary .

Я хочу определять класс "на лету" со свойствами, которые сопоставляются парам ключ / значение из словаря, и методами, основанными на типе данных, которые он представляет. Это позволило бы пользователю командлета получать доступ к значениям как свойствам объекта, а также вызывать для него методы.

Я вижу пример этого с Get-WmiObject. Он возвращает экземпляры ManagementObject (который, по сути, является универсальным пакетом свойств), но пользователь может получить доступ к свойствам и вызвать методы для него напрямую (т. Е. Без необходимости вызывать методы GetPropertyValue / InvokeMethod в ManagementObject).

PS C:\temp> $comp = Get-WmiObject Win32_ComputerSystem
PS C:\temp> $comp | Get-Member

   TypeName: System.Management.ManagementObject#root\cimv2\Win32_ComputerSystem

Name                        MemberType   Definition
----                        ----------   ----------
JoinDomainOrWorkgroup       Method       System.Management.ManagementBaseObject JoinDomainO
Rename                      Method       System.Management.ManagementBaseObject Rename(Syst
SetPowerState               Method       System.Management.ManagementBaseObject SetPowerSta
UnjoinDomainOrWorkgroup     Method       System.Management.ManagementBaseObject UnjoinDomai
AdminPasswordStatus         Property     System.UInt16 AdminPasswordStatus {get;set;}
AutomaticManagedPagefile    Property     System.Boolean AutomaticManagedPagefile {get;set;}
AutomaticResetBootOption    Property     System.Boolean AutomaticResetBootOption {get;set;}
... etc ...

Как мне сделать. сделать это с моими собственными объектами?

ОБНОВЛЕНИЕ

Принятие ответа Кейта, который представляет собой общий подход .NET framework для динамической генерации кода. Это должно сработать для моего сценария, хотя я думаю, что это может быть излишним.

Я надеялся, что кто-то предоставит ясный пример того, как это можно сделать, используя средства, предоставляемые PowerShell. Похоже, должен быть способ динамического создания класса путем расширения классов PSObject , PSProperty и PSMethod , описанных в Powershell SDK ].

К сожалению, документация по этому поводу кажется довольно скудной, с множеством нелепых утверждений вроде « Хотя это можно унаследовать от этого класса, для этого не существует установленного сценария, и любая попытка сделать это может привести к неожиданным результатам. поведение. "

Что еще хуже, так это то, что все ссылки в MSDN, объясняющие систему расширенных типов PowerShell, кажутся плохими! И единственные примеры, которые я видел в сети, - это как сделать это из сценария PowerShell, а не для людей, разрабатывающих командлеты с использованием C # и SDK.

Привет, кто-нибудь из команды PowerShell слушает?

7
задан DSO 21 March 2011 в 03:29
поделиться