2012-03-31 31 views
4

我基本上喜歡在Powershell中使用反射,並且在使用標準powershell命令動態查找要調用的方法後,我最終得到了一個MemberDefinition對象,並且沒有太多線索如何調用它。我不積極,我可以,所以如果你有經驗,你可以說不要這樣做。我知道我可以拖放到裝配的命名空間,但不知道如果我可以做這樣的事情:使用Get-Member進行反射

$method = $ie | get-member -type method | ? { $_.name -eq 'span' } 
invoke-member $ie $method 

$method變量是Microsoft.PowerShell.Commands.MemberDefinition型的,這甚至可能?

謝謝,馬修

+1

確保檢查出http://blogs.msdn.com/b/powershell/archive/2006/07/12/indirectly-invoking-methods-via-variablenames.aspx – 2012-03-31 02:41:52

回答

6

聽起來你很熟悉.NET,爲什麼不直接下拉,使用反射直接?

PS> $d = Get-Date 
PS> $t = $d.GetType() 
PS> $t.InvokeMember("ToUniversalTime", "Public,InvokeMethod,Instance", $null, $d, $null) 

Saturday, March 31, 2012 3:10:51 AM 
+0

我不知道InvokeMember :)我認爲必須有比我做的更好的選擇,但主要只是給出了一個答案,我知道這個答案會作爲一個「回退」,以防其他人以明智的方式沒有得到迴應的機會。 :) – 2012-03-31 15:49:58

+0

好的,是的,謝謝 - 我覺得有一個'腳本'的方式來做反射 - 將字符串傳遞給InvokeMember會讓我得到我以後的東西。 – mlhDev 2012-04-01 01:40:39

5

FWIW,你總是可以做到這一點「老式的」反射(以防萬一,這不是明確提)。

例如:

# get some object 
$proc = get-process | select -first 1 

# get its type and pick a method 
$method = $proc.gettype().getmethods() | ?{ $_.name -eq 'tostring' } 

# invoke 
$method.Invoke($proc, $null) 
+0

嗨詹姆斯,+1 - 有很多方法可以給這隻貓上皮,呃? :-) – 2012-03-31 03:15:02

+0

@凱特希爾:絕對!感謝教我關於InvokeMember :) – 2012-03-31 15:51:05

+0

+1鏈接到_Indirectly通過變量名稱調用方法_--我認爲這就是我原先的想法,但是你和Keith展示的反射在PS中並不是很麻煩。 – mlhDev 2012-04-01 01:47:24