缺少方法异常,但我不明白为什么。

4

我正在使用反射创建一个程序集,然后使用它来创建一个WCF服务客户端的实例。

object obj = 
   assembly.CreateInstance(
       serviceName, true, 
       BindingFlags.CreateInstance,null,createArgs, null, null);

Type type = obj.GetType();

obj 是 HelloWorldServiceClient 类型。

type.GetMethods() 返回 14 个 MethodInfo 结果。第一个是 {Acme.TestService.HelloWorldResponse HelloWorld(Acme.TestService.HelloWorldRequest)}。

但是当我执行

return (T)type.InvokeMember(
    "HelloWorld", BindingFlags.InvokeMethod, null, obj, args);

我遇到了MissingMethodException异常。

type.ContainsGenericParameters的值为false。

args是一个长度为1的object数组,其中包含一个{Acme.TestService.HelloWorldRequest}对象。

我非常困惑。请问有谁能帮助我解决这个问题吗?

2个回答

5
您还可以使用 GetMethod(methodName),然后再 Invoke 它。 如果您是动态创建程序集,我建议执行这两个步骤。 这样,您就可以先找到该方法是否存在,然后再调用它。

3

您说您正在通过反射创建程序集...但是WCF内部也进行了类型生成;我想知道这里是否存在重复?您可以通过以下方式获取由WCF生成的服务类型:

public sealed class WcfClient<T: System.ServiceModel.ClientBase<T>
      where T : class
{
    public T Service { get { return base.Channel; } }
}

然而,关于这个问题:如果你正在使用 TypeBuilder,我想知道你是否已经使用了 DefineMethodOverride 来将实际方法与接口关联起来。在C#中可能是隐式的,但在IL中需要显式声明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接