2016-05-10 6 views
1

У меня есть класс, который я пытаюсь использовать из Powershell. У этого класса есть метод, называемый Execute(), с двумя перегрузками: один, который принимает Func<T> и тот, который принимает Action<T>. Я могу вызвать перегрузку, которая принимает Action<T> с использованием ScriptBlock в качестве делегата, но я не могу понять, как вызвать перегрузку, которая принимает Func<T>:Powershell создает скриптблока для Func <T> вместо Action <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 

Как вызвать перегрузку, которая принимает Func<T>? Я предполагаю, что для этого потребуется создать ScriptBlock с типом возврата, но я не знаю, как это сделать; анализатор Powershell, по-видимому, недостаточно умен, чтобы сделать это автоматически.

+1

'Execute ([Func [INT]] {1 + 1})' – PetSerAl

+0

Это работает ... сделать это и ответить, и я 'll выберите его – Mark

ответ

4

Вы должны бросить ScriptBlock направо тип делегата сами:

$t.Execute([Func[int]]{ 1 + 1 }) 
+0

Отлично, спасибо! – Mark