2009-06-03 8 views
15

tengo dos funciones en mi clase con esta firma,¿Cuál es la mejor forma de convertir la Acción <T> en Func <T,Tres>?

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

¿Cómo puedo pasar el mismo delegado en el segundo método de la primera? Crear un método con un argumento Delegate no es una forma, porque estoy perdiendo algunas informaciones de excepción
¡Muchas gracias!

Respuesta

30

Envuélvalo en un delegado de tipo Func<T, TResult> con un valor de retorno ficticio, p.

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

está pidiendo literalmente que se pase algo que no da el resultado a una función que así lo requiera.
Esto no tiene sentido.

usted puede convertir fácilmente cualquier función de la forma Action<T> a Func<T,TResult> si usted está dispuesto a suministrar algún valor resultado (implícita o explícitamente)

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

o

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