Comment puis-je appeler la méthode d'interface explicitement mis en œuvre à partir de PowerShell?
-
09-09-2019 - |
Question
Code:
add-type @"
public interface IFoo
{
void Foo();
}
public class Bar : IFoo
{
void IFoo.Foo()
{
}
}
"@ -Language Csharp
$bar = New-Object Bar
($bar -as [IFoo]).Foo() # ERROR.
Erreur:
invocation méthode a échoué parce que [Bar] ne contient pas une méthode appelée « Foo ».
La solution
Les mauvaises nouvelles. Il est un bug
https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=249840&SiteID=99
Autres conseils
J'ai écrit quelque chose pour v2.0 PowerShell qui le rend facile d'appeler des interfaces explicites de façon naturelle:
PS> $foo = get-interface $bar ([ifoo])
PS> $foo.Foo()
Voir:
http://www.nivot.org/2009/03/28 /PowerShell20CTP3ModulesInPracticeClosures.aspx
Elle le fait en générant un module dynamique qui Thunks appels à l'interface. La solution est dans le script Powershell pur (pas de tours add type méchant).
-Oisin
Vous pouvez faire quelque chose comme
$bar = New-Object Bar
[IFoo].GetMethod("Foo").Invoke($bar, @())
Vous obtenez ( réflexion representaion de) membre de IFoo
de l'objet Type
et appeler un Invoke
surcharge . Dommage que l'on doit le faire de cette façon, cependant.
Une approche similaire pour les propriétés explicitement mises en œuvre, etc.
Si la méthode prend des arguments, ils vont dans le @()
tableau après la virgule dans le code ci-dessus, bien sûr.