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

时间:2011-04-03 15:30:05

标签: c# .net powershell delegates powershell-v2.0

将.NET方法作为PowerShell中.NET对象的委托回调传递的语法是什么。

例如:

C#:

public class Class1
{
    public static void MyMethod(Action<object> obj)
    {
         obj("Hey!");
    }
}

public class Class2
{
    public static void Callback(object obj)
    {
         Console.Writeline(obj.ToString());
    }
}

的PowerShell:

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

这不起作用。

5 个答案:

答案 0 :(得分:12)

通过Adam和Oisin的聊天工作代码。

Add-Type -Language CSharpVersion3 -TypeDefinition @"
using System;

public class Class1
{
    public static void MyMethod(Action<object> 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)

答案 1 :(得分:4)

通过@oising on Twitter

  

@adamdriscoll你被c#宠坏了   编译器的委托推理。您   需要明确地批准该行动,   旧派风格。

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

答案 2 :(得分:4)

$code = @'
using System;
public class Class1
{    
    public static void MyMethod(Action<object> 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')))

答案 3 :(得分:3)

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

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

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

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

P.S。虽然与问题没有直接关系,但这是此技术的另一个工作示例:在正则表达式中使用脚本块作为匹配评估器委托: How to sort by file name the same way Windows Explorer does?

答案 4 :(得分:1)

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

我认为这是你需要做的事情:

<强> C#

public class Class1
{
    public static void MyMethod(Action<object> obj)
    {
         obj("Hey!");
    }
}

public class Class2
{
    public Action<object> CallBack = obj => Console.WriteLine(obj.ToString());
}

<强> Powershell的:

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