是通过调用web service的方式调用,调试时看到result的类型是EnterpriseServerBase.WebService.DynamicWebCalling.Person,我怎么转华为这个类呢object result = WebServiceHelper.InvokeWebService(url, "GetPerson", args); string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling" ;
  if((classname == null) ||(classname == ""))
  {
  classname = WebServiceHelper.GetWsClassName(url) ;
  }  try
  {
  //获取WSDL
  WebClient wc = new WebClient();
  Stream stream = wc.OpenRead(url+"?WSDL");
  ServiceDescription sd = ServiceDescription.Read(stream);
  ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
  sdi.AddServiceDescription(sd,"","");
  CodeNamespace cn = new CodeNamespace(@namespace);
    
  //生成客户端代理类代码
  CodeCompileUnit ccu = new CodeCompileUnit();
  ccu.Namespaces.Add(cn);
  sdi.Import(cn ,ccu);  
  CSharpCodeProvider csc = new CSharpCodeProvider();
  ICodeCompiler icc = csc.CreateCompiler();
    
  //设定编译参数
  CompilerParameters cplist = new CompilerParameters();
  cplist.GenerateExecutable = false;
  cplist.GenerateInMemory = true;
  cplist.ReferencedAssemblies.Add("System.dll");
  cplist.ReferencedAssemblies.Add("System.XML.dll");
  cplist.ReferencedAssemblies.Add("System.Web.Services.dll");
  cplist.ReferencedAssemblies.Add("System.Data.dll");  //编译代理类
  CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu);
  if(true == cr.Errors.HasErrors)
  {
  System.Text.StringBuilder sb = new System.Text.StringBuilder();
  foreach(System.CodeDom.Compiler.CompilerError ce in cr.Errors)
  {
  sb.Append(ce.ToString());
  sb.Append(System.Environment.NewLine);
  }
  throw new Exception(sb.ToString());
返回的这个object怎么转化为Person类呢

解决方案 »

  1.   

    实体要本地创建object as 实体.
      

  2.   


    我试了,这样不行,转化后还是null
      

  3.   

    动态生成的对象在你临时的assembly里,你无法拿到这个类型的。只能全部用反射。
      

  4.   


    在那个assembly里,详细说下啊
      

  5.   

    我调试时看到result的类型是EnterpriseServerBase.WebService.DynamicWebCalling.Person
    它的每个属性值也得到了我怎么把result转化为EnterpriseServerBase.WebService.DynamicWebCalling.Person类
      

  6.   

    EnterpriseServerBase.WebService.DynamicWebCalling.Person 因为这个类在你运行时生成的,所以你不可能转换成这个对象。EnterpriseServerBase.WebService.DynamicWebCalling.Person p = 
    (EnterpriseServerBase.WebService.DynamicWebCalling.Person)result;可能吗?当然不可能,编写代码的时候还没有上面的类型啊只能通过用反射取值。放到Dictionary<string, object>里。Dictionary<string, object> dict = new Dictionary<string, object>();
    Type t = result.GetType();
    FieldInfo[] fis = t.GetFields();
    foreach(var f in fis)
       dict.Add(f.Name, f.GetValue(result));
      

  7.   

    谁让你搞什么“动态调用web service”呢?为什么不正规地在vs上进行web service编程,在开发程序的时候让vs自动产生服务代理呢?