Tuttavia, la firma funzione non sempre la stessa, avendo così differente quantità 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; }
È veramente 2 opzioni praticabili a vostra disposizione:
1) Mantenere tipo di sicurezza da avere clienti chiamare la funzione direttamente.
Questa è probabilmente la soluzione migliore, a meno che non si abbia molto buoni motivi per rompere con questo modello.
Quando parli di voler intercettare le chiamate di funzione, mi sembra che tu stia cercando di reinventare le funzioni virtuali. C'è un carico di modi per ottenere questo tipo di funzionalità fuori dalla scatola, come ereditare da una classe base e sovrascrivere le sue funzioni.
Sembra a me come si vuole una classe che è più di un involucro di un'istanza derivata di una classe base, in modo da fare qualcosa di simile:
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 una mappa all'ingresso di le tue funzioni a un'interfaccia comune.
Questo potrebbe funzionare se tutte le funzioni sono correlate. Ad esempio, se stai scrivendo un gioco, e tutte le funzioni fanno qualcosa in qualche parte dell'inventario del giocatore o del giocatore. Si finirebbe con qualcosa di simile:
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);
}
}
Questo è un ottimo idioma - può sostituire le dichiarazioni di commutazione brutto. –
La funzione di esempio ha parametri, tuttavia, quando si richiama la funzione memorizzata, la si richiama senza alcun argomento. Gli argomenti vengono risolti quando la funzione è archiviata? –
Quello era solo un esempio scritto male da solo. Non so creare un dizionario che lo faccia, perché la firma della funzione è sempre diversa. – chi