将.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)
这不管用。
发布于 2011-04-04 02:14:23
通过Adam's和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)
发布于 2011-04-04 02:15:02
$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')))
发布于 2011-04-04 00:56:20
[Class2]::Callback
的类型是System.Management.Automation.PSMethod
,它显然不能被内核转换为所需的委托。
我不确定这是否是解决任务的最好方法(我还没有看到任何关于这方面的官方文档),但下面的代码在这个示例中适用于我,在我的实践中也适用于其他类似的情况:
[Class1]::MyMethod({ [Class2]::Callback($args[0]) })
内核能够将我们的脚本块{ [Class2]::Callback($args[0]) }
转换为所需的委托。
附注:虽然与这个问题没有直接关系,但这是该技术的另一个实际示例:在正则表达式中使用脚本块作为匹配求值器委托:How to sort by file name the same way Windows Explorer does?
https://stackoverflow.com/questions/5530522
复制相似问题