【发布时间】:2014-06-23 11:46:34
【问题描述】:
上下文
我有一个 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_meta 这意味着你必须在调用它之前设置它。 dcastro 的回答不需要那个。
-
@DavidG 我希望这些方法在运行时出现。我不在乎它们何时添加。
-
您是否考虑过使用
DynamicProxy?像Dynamic这样的问题是为了获得神奇的行为,你实际上必须在动态的同时调用它们。如果您声明要覆盖的所有成员 virtual 则可以创建一个代理类,它只需调用 call 方法并返回结果。试试 castle DynamicProxy,因为它在这个目的上相当不错。它有点慢,但是当您代理远程调用时,它会产生零差异。