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