Sin embargo, la firma de la función no es siempre la misma, por lo que tiene una cantidad diferente de argumentos.
Comencemos con algunas funciones definidas así:
private object Function1() { return null; }
private object Function2(object arg1) { return null; }
private object Function3(object arg1, object arg3) { return null; }
Realmente tienes 2 opciones viables a tu disposición:
1) Mantenga la seguridad de tipos haciendo que los clientes llamen directamente a su función.
Esta es probablemente la mejor solución, a menos que tenga muy buenas razones para romper con este modelo.
Cuando hablas de querer interceptar llamadas a funciones, me parece que estás tratando de reinventar funciones virtuales. Hay un montón de formas de sacar este tipo de funcionalidad de la caja, como heredar de una clase base y anular sus funciones.
Me parece que quieres una clase que sea más un contenedor que una instancia derivada de una clase base, así que haz algo como esto:
public interface IMyObject
{
object Function1();
object Function2(object arg1);
object Function3(object arg1, object arg2);
}
class MyObject : IMyObject
{
public object Function1() { return null; }
public object Function2(object arg1) { return null; }
public object Function3(object arg1, object arg2) { return null; }
}
class MyObjectInterceptor : IMyObject
{
readonly IMyObject MyObject;
public MyObjectInterceptor()
: this(new MyObject())
{
}
public MyObjectInterceptor(IMyObject myObject)
{
MyObject = myObject;
}
public object Function1()
{
Console.WriteLine("Intercepted Function1");
return MyObject.Function1();
}
public object Function2(object arg1)
{
Console.WriteLine("Intercepted Function2");
return MyObject.Function2(arg1);
}
public object Function3(object arg1, object arg2)
{
Console.WriteLine("Intercepted Function3");
return MyObject.Function3(arg1, arg2);
}
}
2) O asigne la entrada de sus funciones a una interfaz común.
Esto podría funcionar si todas sus funciones están relacionadas. Por ejemplo, si está escribiendo un juego y todas las funciones afectan a alguna parte del jugador o del inventario del jugador. Terminarías con algo como esto:
class Interceptor
{
private object function1() { return null; }
private object function2(object arg1) { return null; }
private object function3(object arg1, object arg3) { return null; }
Dictionary<string, Func<State, object>> functions;
public Interceptor()
{
functions = new Dictionary<string, Func<State, object>>();
functions.Add("function1", state => function1());
functions.Add("function2", state => function2(state.arg1, state.arg2));
functions.Add("function3", state => function3(state.arg1, state.are2, state.arg3));
}
public object Invoke(string key, object state)
{
Func<object, object> func = functions[key];
return func(state);
}
}