2011-01-24 16 views
5

Estoy tratando de escribir lo siguiente: Me gustaría escribir un método "A" que toma como parámetro otro método "B" así como un número desconocido de parámetros para este método B. (params object [] args). Ahora, dentro del método A, me gustaría hacer una llamada a B con los parámetros args. B ahora devolverá un objeto al que me gustaría que A también regrese.C# Método que ejecuta un Método dado

Todo esto suena un poco extraño, por lo tanto, voy a añadir un código de ejemplo:

public object A(Func<object> B, params object[] args) 
{ 
    object x = B.Method.Invoke(args); 

    return x; 
} 

El problema es, que Func no funciona de esa manera. ¿Alguien sabe una manera de hacer esto?

Saludos, Cristiano

+0

hace el código de trabajo si se pasa solamente algunos parámetros definidos, por ejemplo, si se define Func para aceptar un entero y una cadena? Creo que su código está casi bien, no estoy seguro de si Func podría definirse para aceptar params ... –

+0

Sí, funciona si defino los parámetros. Sin embargo, no acepta algo como Func B. – Christian

+1

¿Es una firma fija? ¿Sabes qué tipo B devuelve y lleva? Si no, entonces no puede usar ninguna firma Func <..>. Deberá usar Delegar y invocación dinámica. http://msdn.microsoft.com/en-us/library/system.delegate.dynamicinvoke.aspx – davidfowl

Respuesta

3
void Main() 
{ 
    Func<int> m1=()=>1; 
    Console.WriteLine(A(m1)); 

    Func<int,int> m2=i=>i; 
    Console.WriteLine(A(m2,55)); 
} 

object A(Delegate B,params object[] args) 
{ 

    return B.Method.Invoke(B.Target,args); 
} 

... adiós seguridad de tipos

+0

Esto hace el trabajo. ¡Gracias! Bueno, tienes razón, la seguridad del tipo se ha ido, pero en mi caso no hay otra forma de hacerlo. – Christian

1

Esto debe hacerlo:

public object A(Func<object[], object> B, params object[] args) 
{  
    object x = B(args);  
    return x; 
} 
+0

Esto funcionaría si todas mis B toman una matriz de objetos como parámetro. Podría usar esto, pero sería mejor si las funciones B simplemente permanecen como están. – Christian

3

Func<object> es un delegado de un método que no tiene argumentos y devuelve object. Si lo cambia a Func<object,object>, tomará una discusión y devolver objeto:

public object A(Func<object, object> B, params object[] args) 
{ 
    object x = B(args); 

    return x; 
} 
+0

El problema es que B puede tomar más de 1 argumento. – Christian

+0

@Christian: dado que una matriz también es un 'objeto' puede pasar casi cualquier cosa a un' Func '. Luego depende del método llamado para descubrir lo que realmente obtuvo. Entonces, en su caso con un 'params object [] args', puede pasar' args' a 'Func '. –

+0

¡Ahh ya veo! Tienes razón, eso funcionará. ¡Gracias! – Christian

1

Debe tener un código como éste:

public object A(Func<object[], object> B, params object[] args) 
{ 
    object x = B(args); 

    return x; 
} 

Te falta que la sobrecarga Func necesita aceptar su conjunto de argumentos de objeto.

De todos modos, si necesita este método "A" para aceptar funciones sin parámetros, debe crear una sobrecarga de parámetro de función paremporal de "A".

Cuestiones relacionadas