【问题标题】:C# Calling a method I dont yet know the name of yet? Reflection?C# 调用一个我还不知道名字的方法?反射?
【发布时间】:2009-02-04 01:32:21
【问题描述】:

假设我有以下(相当常见的)模型

客户端调用 Web 服务请求 -> 请求添加到服务器队列 -> 服务器通过 Web 服务调用 3rd 方应用程序 -> 3rd 方应用程序通知服务器事件处理已完成 -> 服务器通知客户端请求已完成

我想知道的是“服务器通过 Web 服务调用 3rd 方应用程序”阶段。第 3 方应用程序公开了在应用程序内部配置的 Web 服务方法。例如,我可能会在这个应用程序中创建一个名为“MultiplyByTwo”的方法。然后我单击“GO”,它会使用 BeginCalculateMultiplyByTwo 和 EndMultiplyByTwo 等方法生成一个 Web 服务(使用 IAsync 模型)。这很棒。

现在我正在创建一个队列对象,以便多个客户端可以请求此服务并让服务器将它们排队以进行顺序执行。所以这个队列对象将有一个类似 runNext() 的方法,它将调用 3rd 方应用程序上的 Web 服务。这很好,只要我知道被调用的方法的名称(在这种情况下为 BegingCaculateMultiplyByTwo),但如果我想动态更改方法的名称怎么办?

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

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

我想这是我可以通过反射实现的吗?

【问题讨论】:

  • 如何调用第三方应用的网络服务?用代理?通过手动构造 SOAP 消息?

标签: c# web-services


【解决方案1】:

你当然可以通过反射来做到这一点:

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" });

【讨论】:

    【解决方案2】:

    要扩展罗伯特的答案,您可以使用泛型和其他东西:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        只有当您已经有一个代理(例如,来自 wsdl.exe)知道所有需要调用的方法时,反射才会起作用。如果您没有代理,那么您在反思方面就不走运了。例如,如果您的中间层需要能够调用它还不知道的 Web 服务中的方法。

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

        WSDL - Web 服务描述语言。

        这意味着 Web 服务是自描述的。 WSDL.exe 所做的只是创建和编译代理类和方法,因此您不必直接使用 xml。

        并不是说您想自己动手,而是 Web 服务本质上只是一种 RPC 机制,它使用 xml 来处理请求和结果。所以你不需要使用花哨的代理对象,你只需要发送 xml 到 web 服务并接收一个 xml 响应并解释它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多