但是,函数签名并不总是相同的,因此具有不同数量的参数。
让我们从定义如下的几个函数开始:
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);
}
}