¿Cómo puedo llamar implementado explícitamente método de interfaz de PowerShell?
-
09-09-2019 - |
Pregunta
Código:
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.
Error:
Método de invocación fracasó porque [bar] no contiene un método llamado 'Foo'.
Solución
Las malas noticias:. Es un error
https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=249840&SiteID=99
Otros consejos
Me escribió algo para PowerShell v2.0 que hace que sea fácil llamar a las interfaces explícitas de una manera natural:
PS> $foo = get-interface $bar ([ifoo])
PS> $foo.Foo()
Ver:
http://www.nivot.org/2009/03/28 /PowerShell20CTP3ModulesInPracticeClosures.aspx
Esto se logra mediante la generación de un módulo dinámico que thunks llamadas a la interfaz. La solución está en escritura PowerShell puro (sin trucos de tipo add desagradables).
-Oisin
Se puede hacer algo como
$bar = New-Object Bar
[IFoo].GetMethod("Foo").Invoke($bar, @())
Se obtiene ( reflexión REPRESENTACIÓN de) el miembro de IFoo
del objeto Type
y llamar a un sobrecarga Invoke
. Es una lástima que uno tiene que hacerlo de esa manera, sin embargo.
enfoque similar para las características implementadas de manera explícita, etc.
Si el método tiene argumentos, que van en la gama @()
después de la coma en el código anterior, por supuesto.