Однако сигнатура функции не всегда одинакова, поэтому у нее разное количество аргументов.
Начнем с нескольких функций, определенных следующим образом:
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);
}
}