Fournir une méthode .NET en tant que rappel de délégué

Quelle est la syntaxe pour transmettre la méthode .NET en tant que rappel délégué à un object .NET dans PowerShell.

Par exemple:

C #:

public class Class1 { public static void MyMethod(Action obj) { obj("Hey!"); } } public class Class2 { public static void Callback(object obj) { Console.Writeline(obj.ToSsortingng()); } } 

PowerShell:

 [Class1]::MyMethod([Class2]::Callback) 

Ça ne marche pas.

Code de travail via le chat d’Adam et Oisin.

 Add-Type -Language CSharpVersion3 -TypeDefinition @" using System; public class Class1 { public static void MyMethod(Action obj) { obj("Hey!"); } } public class Class2 { public static void Callback(object obj) { Console.WriteLine(obj.ToSsortingng()); } } "@ $method = [Class2].GetMethod("Callback") $delegate = [System.Delegate]::CreateDelegate([System.Action[Object]], $null, $method) [Class1]::MyMethod($delegate) 
 $code = @' using System; public class Class1 { public static void MyMethod(Action obj) { obj("Hey!"); } } public class Class2 { public static void Callback(object obj) { Console.WriteLine(obj.ToSsortingng()); } } '@ Add-Type -TypeDefinition $code -Language CSharpVersion3 [class1]::mymethod([system.action]::CreateDelegate('System.Action[Object]', [class2].getmethod('Callback'))) 

Via @oising sur Twitter :

@adamdriscoll vous êtes gâté par l’inférence des delegates du compilateur c #. Vous devez explicitement rééditer cette action, à la manière de la vieille école.

 $method = [Class2].GetMethod("Callback") $delegate = [System.Delegate]::CreateDelegate([System.Action[Object]], $null, $method [Class1]::MyMethod($delegate) 

Le type de [Class2]::Callback est System.Management.Automation.PSMethod qui, apparemment, ne peut pas être converti par le kernel en délégué requirejs.

Je ne suis pas sûr que ce soit le meilleur moyen de résoudre le problème (je n’ai vu aucun type de documentation officielle à ce sujet), mais le code ci-dessous fonctionne pour moi dans cet exemple et dans d’autres cas similaires de ma pratique:

 [Class1]::MyMethod({ [Class2]::Callback($args[0]) }) 

Le kernel est capable de convertir notre bloc de script { [Class2]::Callback($args[0]) } au délégué requirejs.

PS Bien que cela ne soit pas directement lié à la question, voici un autre exemple pratique de cette technique: utilisation de blocs de script en tant que delegates d’évaluation des correspondances dans des expressions régulières: comment sortinger par nom de fichier de la même manière que l’explorateur Windows?

Je ne suis pas un expert en C #, mais après avoir lu quelques articles, il semble que vous essayez d’utiliser des delegates génériques. Votre méthode de rappel n’est pas un délégué générique, ce n’est même pas un délégué.

Je pense que c’est ce que vous devez faire:

C #

 public class Class1 { public static void MyMethod(Action obj) { obj("Hey!"); } } public class Class2 { public Action CallBack = obj => Console.WriteLine(obj.ToSsortingng()); } 

Powershell:

 [Class1]::MyMethod([Class2]::Callback)