Однак підпис функції не завжди однаковий, тому має різну кількість аргументів.
Почнемо з кількох функцій, визначених таким чином:
private object Function1() { return null; }
private object Function2(object arg1) { return null; }
private object Function3(object arg1, object arg3) { return null; }
У вашому розпорядженні дійсно 2 життєздатних варіанти:
1) Підтримуйте безпеку типу, вимагаючи, щоб клієнти безпосередньо викликали вашу функцію.
Це, мабуть, найкраще рішення, якщо у вас немає дуже вагомих причин відмови від цієї моделі.
Коли ви говорите про бажання перехопити виклики функцій, мені здається, що ви намагаєтеся заново винайти віртуальні функції. Існує безліч способів отримати такий тип функціональних можливостей, наприклад, успадкування від базового класу переважних його функцій.
Мені здається, що вам потрібен клас, який більше є обгорткою, ніж похідним екземпляром базового класу, тому зробіть щось подібне:
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) АБО зіставити вхід ваших функцій із загальним інтерфейсом.
Це може спрацювати, якщо всі ваші функції пов'язані. Наприклад, якщо ви пишете гру, і всі функції щось впливають на якусь частину гравця чи інвентар гравця. Ви отримаєте щось подібне:
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);
}
}