What is the best way to convert Action to Func<

2019-06-14 23:00发布

问题:

I have two functions in my class with this signatures,

public static TResult Execute<TResult>(Func<T, TResult> remoteCall);
public static void Execute(Action<T> remoteCall)

How can I pass the same delegate in the second method to the first one? Creating method with Delegate argument is not a way, because I am loosing some exception informations
Thanks a lot!

回答1:

Wrap it in a delegate of type Func<T, TResult> with a dummy return value, e.g.

public static void Execute(Action<T> remoteCall)
{
    Execute(t => { remoteCall(t); return true; });
}


回答2:

you are asking literally to pass something that doesn't supply a result to a function that requires it.
This is nonsensical.

You can easily convert any function of Form Action<T> to Func<T,TResult> if you are willing to supply some result value (either implicitly or explicitly)

Func<T,TResult> MakeDefault<T,TResult>(Action<T> action)
{
    return t =>  { action(t); return default(TResult);}; 
}

or

Func<T,TResult> MakeFixed<T,TResult>(Action<T> action, TResult result)
{
    return t =>  { action(t); return result; };
}