Tuttavia, la firma della funzione non è sempre la stessa, quindi ha una quantità diversa di argomenti.
Cominciamo con alcune funzioni definite in questo modo:
private object Function1() { return null; }
private object Function2(object arg1) { return null; }
private object Function3(object arg1, object arg3) { return null; }
Hai davvero 2 opzioni praticabili a tua disposizione:
1) Mantenere l'indipendenza dai tipi facendo in modo che i client chiamino direttamente la funzione.
Questa è probabilmente la soluzione migliore, se non avete molto buone ragioni per rompere da questo modello.
Quando parli di voler intercettare le chiamate di funzione, mi sembra che tu stia cercando di reinventare le funzioni virtuali. C'è un sacco di modi per ottenere questo tipo di funzionalità fuori dagli schemi, come ereditare da una classe base e sovrascrivere le sue funzioni.
Mi sembra che tu voglia una classe che sia più un wrapper che un'istanza derivata di una classe base, quindi fai qualcosa del genere:
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) OPPURE mappare l'input delle tue funzioni su un'interfaccia comune.
Questo potrebbe funzionare se tutte le tue funzioni sono correlate. Ad esempio, se stai scrivendo un gioco e tutte le funzioni fanno qualcosa per una parte dell'inventario del giocatore o del giocatore. Finiresti con qualcosa del genere:
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);
}
}