Однако функция подписи не всегда то же самое, что имея различное количество аргументов.
Давайте начнем с нескольких функций, определенных следующим образом:
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);
}
}
Это отличная идиома - может заменить неприятные операторы switch. –
В вашем примере функция имеет параметры, однако при вызове хранимой функции вы вызываете ее без каких-либо аргументов. Являются ли аргументы фиксированными при сохранении функции? –
Это был просто плохо написанный пример. Я не знаю, как создать словарь, который бы это сделал, потому что сигнатура функции всегда отличается. – chi