我有一些數據,我從一個數據源獲得的是一串名稱/值對,我存儲在一個字典<字符串,對象>。如何在C#中PowerShell Cmdlet的動態定義類
我想動態地定義一個類,其屬性映射到字典中的鍵/值對和基於它所表示的數據類型的方法。這將允許cmdlet的用戶作爲對象的屬性訪問這些值,並調用其上的方法。
我用Get-WmiObject看到了這個例子。它返回ManagementObject的實例(基本上它是一個通用的屬性包),但用戶可以直接訪問屬性並調用它的方法(即不必調用ManagementObject上的GetPropertyValue/InvokeMethod方法)。
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 ...
我該如何處理自己的物體?
UPDATE
接受基思的答案是動態生成代碼的通用.NET框架的方法。這應該適用於我的場景,儘管我認爲這可能是矯枉過正。
我曾希望有人會提供一個使用PowerShell提供的工具來完成此操作的明確示例。看起來應該有一種方法可以通過擴展Powershell SDK中描述的PSObject,PSProperty和PSMethod類來動態創建類。
不幸的是,圍繞這個的文檔似乎很差,有很多荒謬的陳述,比如「儘管可以從這個類派生,但是沒有確定的方案來做到這一點,並且任何嘗試這樣做都可能導致意外的行爲「
更糟糕的是,MSDN中解釋PowerShell擴展類型系統的所有鏈接似乎都很糟糕!我在網上看到的唯一示例是如何從PowerShell腳本執行此操作,而不是使用C#和SDK開發cmdlet的人員。
你好,任何來自PowerShell團隊的人都在聽嗎?
我正在尋找一種方法來從使用PowerShell SDK編寫的C#Cmdlet中執行此操作。 – DSO 2011-03-18 19:25:12
剛剛經過測試 - 你可以在splats中爲* values *設置不同的類型,這可能有用。 – Neolisk 2013-04-12 12:14:29