Cependant, la signature de la fonction n'est pas toujours la même, ayant donc un nombre d'arguments différent.
Commençons par quelques fonctions définies comme ceci:
private object Function1() { return null; }
private object Function2(object arg1) { return null; }
private object Function3(object arg1, object arg3) { return null; }
Vous avez vraiment 2 options viables à votre disposition:
1) Maintenez la sécurité de type en demandant aux clients d'appeler directement votre fonction.
C'est probablement la meilleure solution, sauf si vous avez de très bonnes raisons de rompre avec ce modèle.
Lorsque vous parlez de vouloir intercepter des appels de fonction, il me semble que vous essayez de réinventer des fonctions virtuelles. Il existe une multitude de façons d'obtenir ce type de fonctionnalité hors de la boîte, comme hériter d'une classe de base et remplacer ses fonctions.
Il me semble que vous voulez une classe qui est plus un wrapper qu'une instance dérivée d'une classe de base, alors faites quelque chose comme ceci:
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) OU mappez l'entrée de vos fonctions sur une interface commune.
Cela peut fonctionner si toutes vos fonctions sont liées. Par exemple, si vous écrivez un jeu et que toutes les fonctions affectent une partie de l'inventaire du joueur ou du joueur. Vous vous retrouveriez avec quelque chose comme ça:
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);
}
}