object[]数组

Lbulang 2014-06-06 01:59:17
类型“System.Data.DataTable”的对象无法转换为类型“System.Object[]”
object[] obj=new object[1];
datatable dt=new datatable();
obj[0]=dt;
然后把这个obj作为参数传到方法,竟然不行??
...全文
5770 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lbulang 2014-06-17
  • 打赏
  • 举报
回复
ee_2499021096 2014-06-11
  • 打赏
  • 举报
回复
数组类型继承于抽象类System.Array,而后者又继承于System.Object。 如例题: static void Main()//入口方法 { Console.Title = "简单电话簿";//设置控制台标题 ArrayList al = new ArrayList();//创建集合对象 string name = string.Empty;//定义字符串变量,用于存放姓名 string phone = string.Empty;//定义字符串变量,用于存放电话号码 while (name != "q")//开始while循环 { Console.Write("请输入姓名(f查看、q 退出):");//提示用户输入姓名 name = Console.ReadLine();//等待用户输入姓名 if (name == "q") break;//判断是否退出 if (name != "f")//判断是否查看电话簿 { Console.Write("请输入电话:");//提示用户输入电话号码 phone = Console.ReadLine();//等待用户输入电话号码 al.Add(new student() { Name = name, Phone = phone });//向集合中添加信息 } else { Console.Clear();//清空控制台 Console.WriteLine("电话号码簿");//输出字符串 foreach (object o in al)//遍历集合输出电话信息信息 { Console.WriteLine("姓名:{0} 电话:{1}", ((student)o).Name, ((student)o).Phone); } Console.WriteLine();//输出空行 } } Console.Clear();//清空控制台 Console.WriteLine("欢迎使用本系统!");//输出欢迎信息 Console.ReadLine();//等待回车继续CodeGo.net中的 } } class student//定义student类 { public string Name;//定义Name字段 public string Phone;//定义Phone字段 }
Lbulang 2014-06-11
  • 打赏
  • 举报
回复
引用 29 楼 ee_2499021096 的回复:
数组类型继承于抽象类System.Array,而后者又继承于System.Object。 如例题: static void Main()//入口方法 { Console.Title = "简单电话簿";//设置控制台标题 ArrayList al = new ArrayList();//创建集合对象 string name = string.Empty;//定义字符串变量,用于存放姓名 string phone = string.Empty;//定义字符串变量,用于存放电话号码 while (name != "q")//开始while循环 { Console.Write("请输入姓名(f查看、q 退出):");//提示用户输入姓名 name = Console.ReadLine();//等待用户输入姓名 if (name == "q") break;//判断是否退出 if (name != "f")//判断是否查看电话簿 { Console.Write("请输入电话:");//提示用户输入电话号码 phone = Console.ReadLine();//等待用户输入电话号码 al.Add(new student() { Name = name, Phone = phone });//向集合中添加信息 } else { Console.Clear();//清空控制台 Console.WriteLine("电话号码簿");//输出字符串 foreach (object o in al)//遍历集合输出电话信息信息 { Console.WriteLine("姓名:{0} 电话:{1}", ((student)o).Name, ((student)o).Phone); } Console.WriteLine();//输出空行 } } Console.Clear();//清空控制台 Console.WriteLine("欢迎使用本系统!");//输出欢迎信息 Console.ReadLine();//等待回车继续CodeGo.net中的 } } class student//定义student类 { public string Name;//定义Name字段 public string Phone;//定义Phone字段 }
哥们 是想 datatable转换成ArrayList 么??
lyx266 2014-06-10
  • 打赏
  • 举报
回复
那这个可能就不是参数问题了 而是调用webservice的问题
Lbulang 2014-06-10
  • 打赏
  • 举报
回复
引用 25 楼 Lbulang 的回复:
[quote=引用 24 楼 laiyongxin 的回复:] [quote=引用 23 楼 Lbulang 的回复:] [quote=引用 22 楼 Lbulang 的回复:] [quote=引用 15 楼 laiyongxin 的回复:]
 // 参数:
 //   obj:
 //     对其调用方法或构造函数的对象。如果方法是静态的,则忽略此参数。如果构造函数是静态的,则此参数必须为 null 或定义该构造函数的类的实例。
 //
 //   parameters:
//     调用的方法或构造函数的参数列表。这是一个对象数组,这些对象与要调用的方法或构造函数的参数具有相同的数量、顺序和类型。如果没有任何参数,则 parameters
public object Invoke(object obj, object[] parameters)
这个是invoke的定义,若你将你定义的object[] obj 这么调用 mi.Invoke(this,obj) 那么是什么意思呢 这时候你的obj是一个object[] 数据 而且你的obj[0]=datatable 是吧 这样 按照invoke的定义 他其实是把 datatable 当做你要调用方法的参数来传了 可是你方法要传的参数是一个object[] 数组 所以就出现你现在的错误了 因此 你需要这么来调用 : mi.Invoke(this, new object[]{obj}); 这时候才是将obj当做你调用方法的参数来传 不知道我说清楚了没有....其实理解了invoke的定义 也就知道错在哪里了
多谢您的指导,我去试试看,最近这个问题都搁着哪里了。[/quote] 不对啊,我已经是搞了个object数组啊。 [WebMethod] public void AddTable(object[] obj) { System.Data.DataTable dt = (System.Data.DataTable)obj[0]; bll.AddTable(dt); } //动态调用AddTable方法 DataTable dt = new DataTable(); object[] obj=new object[1]; obj[0]=dt; WebServiceHelper.InvokeWebService(url, "AddTable", obj); 下面是我在网上随便找的一个动态调用webservice的方法 /// < summary> /// 动态调用web服务 /// < /summary> /// < param name="url">WSDL服务地址< /param> /// < param name="methodname">方法名< /param> /// < param name="args">参数< /param> /// < returns>< /returns> public static object InvokeWebService(string url, string methodname, object[] args) { return WebServiceHelper.InvokeWebService(url, null, methodname, args); } /// < summary> /// 动态调用web服务 /// < /summary> /// < param name="url">WSDL服务地址< /param> /// < param name="classname">类名< /param> /// < param name="methodname">方法名< /param> /// < param name="args">参数< /param> /// < returns>< /returns> public static object InvokeWebService(string url, string classname, string methodname, object[] 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 icc = new CSharpCodeProvider(); //设定编译参数 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()); } //生成代理实例,并调用方法 System.Reflection.Assembly assembly = cr.CompiledAssembly; Type t = assembly.GetType(@namespace + "." + classname, true, true); object obj = Activator.CreateInstance(t); System.Reflection.MethodInfo mi = t.GetMethod(methodname); return mi.Invoke(obj,args); //然后在访问到方法的时候 出异常 }[/quote] 这句 WebServiceHelper.InvokeWebService(url, "AddTable", obj); 改成 WebServiceHelper.InvokeWebService(url, "AddTable", new object[]{obj});[/quote] 出现异常:提示调用目标发生异常,生成XML文档失败。 这个是什么问题?调用目标发生异常,是说调用的方法不对么? [/quote] 这种跟 我传入DataRow[] 是一样的效果,也是出现这种异常。
Lbulang 2014-06-10
  • 打赏
  • 举报
回复
引用 24 楼 laiyongxin 的回复:
[quote=引用 23 楼 Lbulang 的回复:] [quote=引用 22 楼 Lbulang 的回复:] [quote=引用 15 楼 laiyongxin 的回复:]
 // 参数:
 //   obj:
 //     对其调用方法或构造函数的对象。如果方法是静态的,则忽略此参数。如果构造函数是静态的,则此参数必须为 null 或定义该构造函数的类的实例。
 //
 //   parameters:
//     调用的方法或构造函数的参数列表。这是一个对象数组,这些对象与要调用的方法或构造函数的参数具有相同的数量、顺序和类型。如果没有任何参数,则 parameters
public object Invoke(object obj, object[] parameters)
这个是invoke的定义,若你将你定义的object[] obj 这么调用 mi.Invoke(this,obj) 那么是什么意思呢 这时候你的obj是一个object[] 数据 而且你的obj[0]=datatable 是吧 这样 按照invoke的定义 他其实是把 datatable 当做你要调用方法的参数来传了 可是你方法要传的参数是一个object[] 数组 所以就出现你现在的错误了 因此 你需要这么来调用 : mi.Invoke(this, new object[]{obj}); 这时候才是将obj当做你调用方法的参数来传 不知道我说清楚了没有....其实理解了invoke的定义 也就知道错在哪里了
多谢您的指导,我去试试看,最近这个问题都搁着哪里了。[/quote] 不对啊,我已经是搞了个object数组啊。 [WebMethod] public void AddTable(object[] obj) { System.Data.DataTable dt = (System.Data.DataTable)obj[0]; bll.AddTable(dt); } //动态调用AddTable方法 DataTable dt = new DataTable(); object[] obj=new object[1]; obj[0]=dt; WebServiceHelper.InvokeWebService(url, "AddTable", obj); 下面是我在网上随便找的一个动态调用webservice的方法 /// < summary> /// 动态调用web服务 /// < /summary> /// < param name="url">WSDL服务地址< /param> /// < param name="methodname">方法名< /param> /// < param name="args">参数< /param> /// < returns>< /returns> public static object InvokeWebService(string url, string methodname, object[] args) { return WebServiceHelper.InvokeWebService(url, null, methodname, args); } /// < summary> /// 动态调用web服务 /// < /summary> /// < param name="url">WSDL服务地址< /param> /// < param name="classname">类名< /param> /// < param name="methodname">方法名< /param> /// < param name="args">参数< /param> /// < returns>< /returns> public static object InvokeWebService(string url, string classname, string methodname, object[] 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 icc = new CSharpCodeProvider(); //设定编译参数 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()); } //生成代理实例,并调用方法 System.Reflection.Assembly assembly = cr.CompiledAssembly; Type t = assembly.GetType(@namespace + "." + classname, true, true); object obj = Activator.CreateInstance(t); System.Reflection.MethodInfo mi = t.GetMethod(methodname); return mi.Invoke(obj,args); //然后在访问到方法的时候 出异常 }[/quote] 这句 WebServiceHelper.InvokeWebService(url, "AddTable", obj); 改成 WebServiceHelper.InvokeWebService(url, "AddTable", new object[]{obj});[/quote] 出现异常:提示调用目标发生异常,生成XML文档失败。 这个是什么问题?调用目标发生异常,是说调用的方法不对么?
lyx266 2014-06-10
  • 打赏
  • 举报
回复
引用 23 楼 Lbulang 的回复:
[quote=引用 22 楼 Lbulang 的回复:] [quote=引用 15 楼 laiyongxin 的回复:]
 // 参数:
 //   obj:
 //     对其调用方法或构造函数的对象。如果方法是静态的,则忽略此参数。如果构造函数是静态的,则此参数必须为 null 或定义该构造函数的类的实例。
 //
 //   parameters:
//     调用的方法或构造函数的参数列表。这是一个对象数组,这些对象与要调用的方法或构造函数的参数具有相同的数量、顺序和类型。如果没有任何参数,则 parameters
public object Invoke(object obj, object[] parameters)
这个是invoke的定义,若你将你定义的object[] obj 这么调用 mi.Invoke(this,obj) 那么是什么意思呢 这时候你的obj是一个object[] 数据 而且你的obj[0]=datatable 是吧 这样 按照invoke的定义 他其实是把 datatable 当做你要调用方法的参数来传了 可是你方法要传的参数是一个object[] 数组 所以就出现你现在的错误了 因此 你需要这么来调用 : mi.Invoke(this, new object[]{obj}); 这时候才是将obj当做你调用方法的参数来传 不知道我说清楚了没有....其实理解了invoke的定义 也就知道错在哪里了
多谢您的指导,我去试试看,最近这个问题都搁着哪里了。[/quote] 不对啊,我已经是搞了个object数组啊。 [WebMethod] public void AddTable(object[] obj) { System.Data.DataTable dt = (System.Data.DataTable)obj[0]; bll.AddTable(dt); } //动态调用AddTable方法 DataTable dt = new DataTable(); object[] obj=new object[1]; obj[0]=dt; WebServiceHelper.InvokeWebService(url, "AddTable", obj); 下面是我在网上随便找的一个动态调用webservice的方法 /// < summary> /// 动态调用web服务 /// < /summary> /// < param name="url">WSDL服务地址< /param> /// < param name="methodname">方法名< /param> /// < param name="args">参数< /param> /// < returns>< /returns> public static object InvokeWebService(string url, string methodname, object[] args) { return WebServiceHelper.InvokeWebService(url, null, methodname, args); } /// < summary> /// 动态调用web服务 /// < /summary> /// < param name="url">WSDL服务地址< /param> /// < param name="classname">类名< /param> /// < param name="methodname">方法名< /param> /// < param name="args">参数< /param> /// < returns>< /returns> public static object InvokeWebService(string url, string classname, string methodname, object[] 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 icc = new CSharpCodeProvider(); //设定编译参数 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()); } //生成代理实例,并调用方法 System.Reflection.Assembly assembly = cr.CompiledAssembly; Type t = assembly.GetType(@namespace + "." + classname, true, true); object obj = Activator.CreateInstance(t); System.Reflection.MethodInfo mi = t.GetMethod(methodname); return mi.Invoke(obj,args); //然后在访问到方法的时候 出异常 }[/quote] 这句 WebServiceHelper.InvokeWebService(url, "AddTable", obj); 改成 WebServiceHelper.InvokeWebService(url, "AddTable", new object[]{obj});
Lbulang 2014-06-10
  • 打赏
  • 举报
回复
引用 22 楼 Lbulang 的回复:
[quote=引用 15 楼 laiyongxin 的回复:]
 // 参数:
 //   obj:
 //     对其调用方法或构造函数的对象。如果方法是静态的,则忽略此参数。如果构造函数是静态的,则此参数必须为 null 或定义该构造函数的类的实例。
 //
 //   parameters:
//     调用的方法或构造函数的参数列表。这是一个对象数组,这些对象与要调用的方法或构造函数的参数具有相同的数量、顺序和类型。如果没有任何参数,则 parameters
public object Invoke(object obj, object[] parameters)
这个是invoke的定义,若你将你定义的object[] obj 这么调用 mi.Invoke(this,obj) 那么是什么意思呢 这时候你的obj是一个object[] 数据 而且你的obj[0]=datatable 是吧 这样 按照invoke的定义 他其实是把 datatable 当做你要调用方法的参数来传了 可是你方法要传的参数是一个object[] 数组 所以就出现你现在的错误了 因此 你需要这么来调用 : mi.Invoke(this, new object[]{obj}); 这时候才是将obj当做你调用方法的参数来传 不知道我说清楚了没有....其实理解了invoke的定义 也就知道错在哪里了
多谢您的指导,我去试试看,最近这个问题都搁着哪里了。[/quote] 不对啊,我已经是搞了个object数组啊。 [WebMethod] public void AddTable(object[] obj) { System.Data.DataTable dt = (System.Data.DataTable)obj[0]; bll.AddTable(dt); } //动态调用AddTable方法 DataTable dt = new DataTable(); object[] obj=new object[1]; obj[0]=dt; WebServiceHelper.InvokeWebService(url, "AddTable", obj); 下面是我在网上随便找的一个动态调用webservice的方法 /// < summary> /// 动态调用web服务 /// < /summary> /// < param name="url">WSDL服务地址< /param> /// < param name="methodname">方法名< /param> /// < param name="args">参数< /param> /// < returns>< /returns> public static object InvokeWebService(string url, string methodname, object[] args) { return WebServiceHelper.InvokeWebService(url, null, methodname, args); } /// < summary> /// 动态调用web服务 /// < /summary> /// < param name="url">WSDL服务地址< /param> /// < param name="classname">类名< /param> /// < param name="methodname">方法名< /param> /// < param name="args">参数< /param> /// < returns>< /returns> public static object InvokeWebService(string url, string classname, string methodname, object[] 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 icc = new CSharpCodeProvider(); //设定编译参数 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()); } //生成代理实例,并调用方法 System.Reflection.Assembly assembly = cr.CompiledAssembly; Type t = assembly.GetType(@namespace + "." + classname, true, true); object obj = Activator.CreateInstance(t); System.Reflection.MethodInfo mi = t.GetMethod(methodname); return mi.Invoke(obj,args); //然后在访问到方法的时候 出异常 }
Lbulang 2014-06-10
  • 打赏
  • 举报
回复
引用 15 楼 laiyongxin 的回复:
 // 参数:
 //   obj:
 //     对其调用方法或构造函数的对象。如果方法是静态的,则忽略此参数。如果构造函数是静态的,则此参数必须为 null 或定义该构造函数的类的实例。
 //
 //   parameters:
//     调用的方法或构造函数的参数列表。这是一个对象数组,这些对象与要调用的方法或构造函数的参数具有相同的数量、顺序和类型。如果没有任何参数,则 parameters
public object Invoke(object obj, object[] parameters)
这个是invoke的定义,若你将你定义的object[] obj 这么调用 mi.Invoke(this,obj) 那么是什么意思呢 这时候你的obj是一个object[] 数据 而且你的obj[0]=datatable 是吧 这样 按照invoke的定义 他其实是把 datatable 当做你要调用方法的参数来传了 可是你方法要传的参数是一个object[] 数组 所以就出现你现在的错误了 因此 你需要这么来调用 : mi.Invoke(this, new object[]{obj}); 这时候才是将obj当做你调用方法的参数来传 不知道我说清楚了没有....其实理解了invoke的定义 也就知道错在哪里了
多谢您的指导,我去试试看,最近这个问题都搁着哪里了。
Lbulang 2014-06-10
  • 打赏
  • 举报
回复
引用 27 楼 laiyongxin 的回复:
那这个可能就不是参数问题了 而是调用webservice的问题
不知道排除啥地方了 代码就几句 都没啥问题。
smthgdin_020 2014-06-09
  • 打赏
  • 举报
回复
是调用的问题,前面的赋值是可以的。
lyx266 2014-06-09
  • 打赏
  • 举报
回复
 // 参数:
 //   obj:
 //     对其调用方法或构造函数的对象。如果方法是静态的,则忽略此参数。如果构造函数是静态的,则此参数必须为 null 或定义该构造函数的类的实例。
 //
 //   parameters:
//     调用的方法或构造函数的参数列表。这是一个对象数组,这些对象与要调用的方法或构造函数的参数具有相同的数量、顺序和类型。如果没有任何参数,则 parameters
public object Invoke(object obj, object[] parameters)
这个是invoke的定义,若你将你定义的object[] obj 这么调用 mi.Invoke(this,obj) 那么是什么意思呢 这时候你的obj是一个object[] 数据 而且你的obj[0]=datatable 是吧 这样 按照invoke的定义 他其实是把 datatable 当做你要调用方法的参数来传了 可是你方法要传的参数是一个object[] 数组 所以就出现你现在的错误了 因此 你需要这么来调用 : mi.Invoke(this, new object[]{obj}); 这时候才是将obj当做你调用方法的参数来传 不知道我说清楚了没有....其实理解了invoke的定义 也就知道错在哪里了
lyx266 2014-06-09
  • 打赏
  • 举报
回复
引用 9 楼 Lbulang 的回复:
[quote=引用 7 楼 laiyongxin 的回复:] [quote=引用 6 楼 Lbulang 的回复:] System.Reflection.MethodInfo mi = t.GetMethod(methodname);//methodname是调用的方法名称 return mi.Invoke(obj, args);//我想把obj这个参数传入这里 // public object Invoke(object obj, object[] parameters); 这个是webservice动态调用的系统方法 。 难道是 Invoke 不支持这种参数??
并不是object[] 的问题是lz调用的时候又问题 我想你是这样调用的吧 return mi.Invoke(this, obj);// obj是你定义的object[] 你应该这样调用 return mi.Invoke(this, new object[]{obj});// obj是你定义的object[] [/quote] 我刚刚上面写错了 return mi.Invoke(obj, args); 这里的args 就是ojbect[] 数组来的 已经在前面定义好了的。 object[] obj=new object[1]; datatable dt=new datatable(); obj[0]=dt; 也就是说 args=obj 。 Invoke我传进去的两个参数 第一个是一个object ,第二个是object数组。[/quote] 你不能直接将 obj 传进去 只能像这样 :return mi.Invoke(this, new object[]{obj}); 去传你的object[] 参数 你可以试试
Lbulang 2014-06-09
  • 打赏
  • 举报
回复
引用 20 楼 smthgdin 的回复:
System.Data.DataTable dt = (System.Data.DataTable)obj[0]; 这句设个断点调试一下。
能读到dt啊 没问题 (没有通过Invoke 去调用的情况下)
smthgdin_020 2014-06-09
  • 打赏
  • 举报
回复
System.Data.DataTable dt = (System.Data.DataTable)obj[0]; 这句设个断点调试一下。
Lbulang 2014-06-09
  • 打赏
  • 举报
回复
引用 16 楼 smthgdin 的回复:
是调用的问题,前面的赋值是可以的。
我把代码贴出来,大家看看。 这个是WebService的方法。 [WebMethod] public void AddTable(object[] obj) { System.Data.DataTable dt = (System.Data.DataTable)obj[0]; bll.AddTable(dt); } //动态调用AddTable方法 DataTable dt = new DataTable(); object[] obj=new object[1]; obj[0]=dt; WebServiceHelper.InvokeWebService(url, "AddTable", obj); 下面是我在网上随便找的一个动态调用webservice的方法 /// < summary> /// 动态调用web服务 /// < /summary> /// < param name="url">WSDL服务地址< /param> /// < param name="methodname">方法名< /param> /// < param name="args">参数< /param> /// < returns>< /returns> public static object InvokeWebService(string url, string methodname, object[] args) { return WebServiceHelper.InvokeWebService(url, null, methodname, args); } /// < summary> /// 动态调用web服务 /// < /summary> /// < param name="url">WSDL服务地址< /param> /// < param name="classname">类名< /param> /// < param name="methodname">方法名< /param> /// < param name="args">参数< /param> /// < returns>< /returns> public static object InvokeWebService(string url, string classname, string methodname, object[] 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 icc = new CSharpCodeProvider(); //设定编译参数 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()); } //生成代理实例,并调用方法 System.Reflection.Assembly assembly = cr.CompiledAssembly; Type t = assembly.GetType(@namespace + "." + classname, true, true); object obj = Activator.CreateInstance(t); System.Reflection.MethodInfo mi = t.GetMethod(methodname); return mi.Invoke(obj,args); //然后在访问到方法的时候 出异常 } catch (Exception ex) { throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace)); } }
Lbulang 2014-06-09
  • 打赏
  • 举报
回复
引用 17 楼 xugan666 的回复:
DataTable dt = new DataTable(); object[] obj = new object[1]; obj[0] = dt; Test(obj); protected void Test(object[] obj) { }
我也这样的啊 ,只不过我那个调用的方法需要通过webservice 去访问 ,webserive是个动态访问的东东,我把地址,参数通过中间动态访问方法 ,去调用对应的webservice方法。但我传的参数是一个DataTable ,所以在执行动态调用的时候就是出现这个异常。
xugan666 2014-06-09
  • 打赏
  • 举报
回复
DataTable dt = new DataTable(); object[] obj = new object[1]; obj[0] = dt; Test(obj); protected void Test(object[] obj) { }
Lbulang 2014-06-06
  • 打赏
  • 举报
回复
引用 10 楼 u011762977 的回复:
obj 是所有类型的基类,你如果把obj给datatable请把obj定义类型.
咋个定义
花猫阳 2014-06-06
  • 打赏
  • 举报
回复
obj 是所有类型的基类,你如果把obj给datatable请把obj定义类型.
加载更多回复(10)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧