Projet

Général

Profil

Function New-Delegate

function New-Delegate(
      [Type]$DelegateType, 
      [ScriptBlock]$Script, 
      [Management.Automation.Runspaces.Runspace]$Runspace = [Management.Automation.Runspaces.Runspace]::DefaultRunspace
  )

La création de type délégué n'est pas nativement possible sous PowerShell, bien qu'un scriptblock puisse être transtypé en un délégué System.Eventhandler :

$sb={Write-host "Sb" }
$sb.GetType()
$EvtHndl=[System.EventHandler] $sb
$EvtHndl.GetType()

#Ou
[System.EventHandler] $EventHandlerBtn = $ExecutionContext.InvokeCommand.NewScriptBlock("Write-Host 'Sb'")

Cette fonction permet de créer tout type de délégués génériques ou pas. Reste qu'une fois créé, leur utilisation n'est pas des plus simple.

On utilise un délégué de type System.Predicate<T> :

 public static bool TrueForAll<T>( T[] array, Predicate<T> match)

pour les tableaux suivants:
[Int32[]]$T=1..10
[Int32[]]$T2=1..11 

On crée un délégué générique :
$deleg = New-Delegate System.Predicate``1[System.Int32] {$Args[0] -le 10}

  #Obtient la signature de la méthode [System.Array]::TrueForAll utilisant un délégué générique 
[System.Reflection.MethodInfo] $Methode = [System.Array].GetMethod("TrueForAll")

  #Crée la méthode avec le type du tableau manipulé, à savoir [System.Int32]
  #Nativement PowerShell V1 gère mal les classes génériques 
$MethodeGenerique = $Methode.MakeGenericMethod([System.Int32])

Que l'on appel via la méthode Invoke
$MethodeGenerique.Invoke($null,@($T,$Deleg))
$MethodeGenerique.Invoke($null,@($T2,$Deleg))

Ce qui peut être codé en PowerShell de la manière suivante :
$Success=&{$T|
 Where {$All++;$_ -le 10 }|
 Foreach-Object -begin {$All,$Count=0,0} -process {[void]$count++} –end {$Count -eq $All}
}
$Success

Malheureusement, cela ne sera pas toujours possible...