提供.NET方法作为委托回调

将.NET方法作为代理回调传递给PowerShell中的.NET对象的语法是什么?

例如:

C#:

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

电源shell:

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

这不起作用。

通过Adam’s和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.ToString()); } } "@ $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.ToString()); } } '@ Add-Type -TypeDefinition $code -Language CSharpVersion3 [class1]::mymethod([system.action]::CreateDelegate('System.Action[Object]', [class2].getmethod('Callback'))) 

通过Twitter上的@oising :

@adamdriscoll你被c#编译器的委托推理破坏了。 你需要明确地宣传这个行动,老派风格。

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

[Class2]::Callback的类型是System.Management.Automation.PSMethod ,它显然无法由核心转换为所需的委托。

我不确定这是解决任务的最佳方式(我还没有看到任何关于此的官方文档)但是下面的代码在我的实例中适用于我和其他类似的情况:

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

核心能够将我们的脚本块{ [Class2]::Callback($args[0]) }转换为所需的委托。

PS虽然与问题没有直接关系,但这里是这个技术的另一个工作示例:在正则表达式中使用脚本块作为匹配评估器委托: 如何按照Windows资源管理器的方式按文件名排序?

我不是C#的专家,但在阅读了几篇文章后,您似乎正在尝试使用generics代理。 您的Callback方法不是通用委托,甚至不是委托。

我想这就是你需要做的:

C#

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

电源shell:

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