假设我有以下(相当常见的)模型
客户端调用web服务请求添加到服务器队列的->请求->服务器通过web服务调用第三方应用程序->第三方应用程序通知服务器事件处理已完成->服务器通知客户端请求已完成
我想知道的是“服务器通过web服务调用第三方应用程序”阶段。第三方应用程序公开在应用程序内部配置的web服务方法。例如,我可以在此应用程序中创建一个名为“MultiplyByTwo”的方法。然后我点击'GO‘,它会生成一个带有BeginCalculateMultiplyByTwo和EndMultiplyByTwo (使用IAsync模型)等方法的web服务。这太棒了。
现在,我正在创建一个queue对象,以便多个客户端可以请求此服务,并让服务器将它们排入队列,以便顺序执行。因此,这个队列对象将有一个像runNext()这样的方法,它将调用第三方应用程序上的web服务。只要我知道要调用的方法的名称(在本例中是BegingCaculateMultiplyByTwo),这就很好了,但是如果我想动态更改方法的名称呢?
因此,在第三方应用程序中,我更改了我的web服务方法,并将其命名为“MultiplyByThree”。这将使用可预测的命名方案公开BeginMultiplyByThree和其他一些方法。我如何设置我的类来动态调用一个我还不知道其名称的方法?
理想情况下,如果我可以在app.config文件中设置要调用的方法的名称,那就太好了。
我想这是我可以通过反思来实现的?
发布于 2009-02-04 01:44:42
你当然可以通过反射来做到这一点:
MyClass o = new MyClass();
MethodInfo method = o.GetType().GetMethod("UnknownMethod",
BindingFlags.Instance | BindingFlags.Public);
MyRetValue retValue = (MyRetValue)
method.Invoke(o, new object[] { "Arg1", 2, "Arg3" });发布于 2009-02-04 01:58:03
要扩展Robert的答案,您可以使用泛型和其他东西:
public TReturn DynamicInvoker<T, TReturn>(T obj, string methodName, param[] args){
MethodInfo method = obj.GetType.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public);
(TResult)method.Invoke(obj, args);
}如果你想让它变得非常可怕,你可以将其作为对象的静态方法来实现。您还可以将BindingFlags作为方法参数传递。
发布于 2009-02-04 01:44:18
也许this会有所帮助--它是一个使用反射的动态web服务方法执行器。
https://stackoverflow.com/questions/509759
复制相似问题