English 中文(简体)
如何在C#中调用尚不知道名称的方法?反射?
原标题:
  • 时间:2009-02-04 01:32:21
  •  标签:

假设我有以下(相当普遍的)模型

客户调用网络服务请求 -> 请求添加到服务器队列中 -> 服务器通过网络服务调用第三方应用程序 -> 第三方应用程序通知服务器事件处理完成 -> 服务器通知客户请求完成。

我想知道的是服务器通过web服务调用第三方应用程序的阶段。第三方应用程序公开应用程序内配置的Web服务方法。例如,我可以在此应用程序中创建一个称为MultiplyByTwo的方法。然后我点击GO,它会生成一个Web服务,带有像BeginCalculateMultiplyByTwo和EndMultiplyByTwo(使用IAsync模型)这样的方法。这真的很好。

现在我正在创建一个队列对象,以便多个客户端可以请求此服务,并使服务器将它们排队进行顺序执行。因此,此队列对象将具有类似于runNext()的方法,该方法将调用第三方应用程序上的Web服务。只要我知道正在调用的方法的名称(在这种情况下为BegingCaculateMultiplyByTwo),这样做就很好,但是如果我想动态更改方法的名称呢?

所以在第三方应用程序中,我更改了我的 Web 服务方法并将其调用为“ MultiplyByThree ”。这将公开 BeginMultiplyByThree 和其他具有可预测命名方案的方法。如何设置我的类以动态地调用我尚不知道名称的方法?

理想情况下,如果我可以在app.config文件中设置要调用的方法的名称,那就太好了。

我猜这是通过反射来做到的?

最佳回答

你可以通过反射来完成这个任务:

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" });
问题回答

要进一步扩展罗伯特的答案,您可以使用泛型和其他东西来实现:

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 作为方法参数传递。

也许这个会有帮助-它是一个使用反射的动态Web服务方法执行器。

只有当您已经拥有了一个代理对象(例如wsdl.exe生成的),它已经了解所有需要被调用的方法时,反射才能起作用。如果没有代理对象,使用反射就会遇到麻烦。例如,如果您的中间层需要能够调用尚未知晓的Web服务方法。

请注意,如果 Web 服务方法采用非原始类型,则反射也将更难进行。

WSDL - Web服务描述语言。

意思是Web服务是自我描述的。WSDL.exe所做的就是创建和编译代理类和方法,因此您无需直接使用xml。

并不是说你要自己做,但网络服务本质上只是一个RPC机制,使用xml进行请求和结果的传输。因此,你不需要使用复杂的代理对象,只需要向Web服务发送xml并接收xml响应并解释即可。





相关问题
热门标签