Die Funktionssignatur ist jedoch nicht immer gleich und weist daher unterschiedliche Argumente auf.
Beginnen wir mit einigen Funktionen, die wie folgt definiert sind:
private object Function1() { return null; }
private object Function2(object arg1) { return null; }
private object Function3(object arg1, object arg3) { return null; }
Sie haben wirklich 2 realisierbare Optionen zur Verfügung:
1) Sorgen Sie für Typensicherheit, indem Kunden Ihre Funktion direkt aufrufen.
Dies ist wahrscheinlich die beste Lösung, es sei denn, Sie haben sehr gute Gründe, von diesem Modell abzubrechen.
Wenn Sie davon sprechen, Funktionsaufrufe abfangen zu wollen, klingt es für mich so, als würden Sie versuchen, virtuelle Funktionen neu zu erfinden. Es gibt eine Vielzahl von Möglichkeiten, um diese Art von Funktionalität sofort einsatzbereit zu machen, z. B. das Erben von Funktionen von einer Basisklasse und das Überschreiben ihrer Funktionen.
Für mich klingt es so, als ob Sie eine Klasse wollen, die eher ein Wrapper als eine abgeleitete Instanz einer Basisklasse ist. Machen Sie also so etwas:
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) ODER ordnen Sie die Eingabe Ihrer Funktionen einer gemeinsamen Schnittstelle zu.
Dies kann funktionieren, wenn alle Ihre Funktionen miteinander verbunden sind. Wenn Sie beispielsweise ein Spiel schreiben und alle Funktionen einen Teil des Inventars des Spielers oder des Spielers beeinflussen. Sie würden mit so etwas enden:
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);
}
}