Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Powershell create scriptblock for Func<T> instead of Action<T>

I have a class I'm attempting to use from Powershell. This class has a method, called Execute(), with two overloads: one which takes a Func<T> and one which takes an Action<T>. I can call the overload that takes an Action<T> using a scriptblock as the delegate, but I cannot figure out how to call the overload that takes a Func<T>:

add-type -TypeDefinition @'
using System;

public class DelegTest
{
    public R Execute<R>(Func<R> method)
    {
        return method();
    }

    public void Execute(Action method)
    {
        Execute(() => { method(); return true; });
    }
}
'@

$t = new-object DelegTest
$t.Execute({ 1 + 1 }) # returns nothing

How do I call the overload that takes a Func<T>? I assume this would require creating a ScriptBlock that has a return type, but I don't know how to do this; the Powershell parser apparently isn't smart enough to do this automatically.

like image 731
Mark Avatar asked Feb 08 '23 01:02

Mark


1 Answers

You need to cast ScriptBlock to right delegate type by yourself:

$t.Execute([Func[int]]{ 1 + 1 })
like image 190
user4003407 Avatar answered Feb 24 '23 00:02

user4003407