2012-03-31 8 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

ねえジェームズ、1 http://blogs.msdn.com/b/powershell/archive/2006/07/12/indirectly-invoking-methods-via-variablenames.aspx –

答えて

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について知りませんでした:)私は、私がやったよりも優れた選択肢がなければならないと考えましたが、主に、他の人が力の道で賢明な場合に「フォールバック」として働くことを知っていた答えを主に与えました応答する機会を得られなかった。 :) –

+0

ありがとう、ええ、ありがとう - InvokeMemberに文字列を渡すことが、私が後になっていることを私に知らせるための "スクリプトのような"方法があるように感じた。 – mlhDev

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

をチェックアウトしてください - この猫には多くの方法があります。 :-) –

+0

@KeithHill:間違いなく! InvokeMemberについて教えていただきありがとうございます:) –

+0

+1直接的なメソッドへのリンクVariablenames_を介して - 私はそれが当初考えていたものだと思いますが、あなたとキースはリフレクションがPSで面倒ではないと証明しました。 – mlhDev