背景
我有一个C#类PyroProxy,其中有一个call(string method, params object[] arguments)
方法。
public class PyroProxy : IDisposable {
public object call(string method, params object[] arguments)
}
这是远程对象代理类。
动机
在代码中一直使用call方法看起来不太好看。
问题
假设PyroProxy类没有test_method()方法。我该如何使下面的代码正常工作?
PyroProxy p = new PyroProxy();
p.test_method();
test_method
的代码如下:
public object test_method(params object[] arguments) {
return call("test_method", arguments); // you get the point
}
这可能是一个我没有找到的重复问题,也许可以在编译时或运行时实现。 我该怎么做才能更接近这个目标?欢迎提供提示。有关如何注入方法的答案,请参见。我找到了ExpandoObject ,但它没有告诉我如何创建未知方法。
dictionary.Add("Shout", new Action(() => { Console.WriteLine("Hellooo!!!"); })); person.Shout();
- private_metaDynamicProxy
吗?像Dynamic
这样的东西的问题在于,为了获得魔法行为,你实际上必须调用它们,同时它们本身也是动态的。如果你声明想要重写的所有成员都是虚拟的,那么可以创建一个代理类,它只需调用调用方法并返回结果即可。尝试使用Castle DynamicProxy,因为它在这方面相当不错。它稍微有点慢,但由于你正在代理远程调用,所以没有任何影响。 - Michael Bcall
方法并传递方法名。使用 Castle 的工具生成继承类,从而使用拦截器。代理覆盖了所有成员,并添加了对拦截器的调用。与使用 dynamic 相比,优点在于你可以使用此代理类而无需将其声明为 dynamic,因此代码类型更安全。 - Michael B