实现是没办法了, 向大家求且. 关于Assembly.CreateInstance(),一直报找不到构造函数

tank_2009 2010-03-30 10:27:12

_objMethod = _objAssembly.CreateInstance(_sClassName, false, BindingFlags.Default , null,
new object[] {txtBuildParam.Text.Split(',')}, null, null);


这句话一直报错找不到构造函数

然尔如果改成调用不需要参数的构造函数却可以通过.


其中参数 txtBuildParam.Text 的内容是: "add,true,slag,true,50.5,100"
带参的构造函数是:

public ClsBOFAngle(string sID1, object o1, string sID2, object o2, double dIni, int iSpeed)


请大家帮忙 .谢谢.
...全文
649 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
tank_2009 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 xingyuebuyu 的回复:]
string s1 = "add,true,slag,true,50.5,100";
string[] str = s1.Split(',');
_objMethod = _objAssembly.CreateInstance(_sClassName, false, BindingFlags.Default , null,
new object[] { str[0], new object[……
[/Quote]

有通用一点的办法吗??? 如果参数变了,又得改程序了.谢谢
xingyuebuyu 2010-03-31
  • 打赏
  • 举报
回复
string s1 = "add,true,slag,true,50.5,100";
string[] str = s1.Split(',');
_objMethod = _objAssembly.CreateInstance(_sClassName, false, BindingFlags.Default , null,
new object[] { str[0], new object[] { bool.Parse(str[1]) }, str[2], new object[] { bool.Parse(str[3]) }, double.Parse(str[4]), int.Parse(str[5]) }, null, null);

传5个对应类型的参数进去,你再加上相应的异常处理。
StonePicker 2010-03-31
  • 打赏
  • 举报
回复
你的代码里这个参数new object[] {txtBuildParam.Text.Split(',')} 写错了,这里表示只有一个参数的构造函数(参数为string[]),当然就对应不上你的那个5个参数的构造函数了。
tank_2009 2010-03-31
  • 打赏
  • 举报
回复
自己顶一下,请大家帮忙 .
tank_2009 2010-03-31
  • 打赏
  • 举报
回复
谢谢 wanghui0380 告诉了GetConstructors()方法. 很适合我现在的项目

谢谢
zgke 2010-03-31
  • 打赏
  • 举报
回复
你传递的参数 object[]{string[]}

object[].Count==1

找不到public ClsBOFAngle(string[])的。
wanghui0380 2010-03-31
  • 打赏
  • 举报
回复
type.GetConstructors()方法,可以获取所有的构造

但是比较头疼的事,实际你很难知道具体调用的是谁。

因为调用规则是由参数查找方法签名,而不是如你这样由方法签名去生成参数对象。(这个比较困难,因为你是string,string要转成对象要根据不同的情况去convert,去new。所以不存在一个通用的转换过程,即使是微软已经写了一个 Convert.ChangeType()方法,也不太现实,那个异常太多了,光对付异常就有的烦了)

tank_2009 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 criedshy 的回复:]
是的,我也打算自己构造一个参数数组, 但是我怎么可以知道构造函数的参数个数,参数对应的类型呢??谢谢.

你都不知道你怎么调用,既然这样,你还不如写一个无参数的构造器呢
[/Quote]

在执行CreateInstance,他不会自动会根据你所给的参数去匹配最合适的构造函数吗?

但是这个类的构造函数只有一个,所有我想问问有没有方法知道 构造函数的参数类型???
wanghui0380 2010-03-31
  • 打赏
  • 举报
回复
目前有两种

第一种,传统的方式,把参数封成一个对象,传递只传一个对象。参数对象可以使用工厂类完成

我的参数对象 参数对象=参数对象工厂.creat("我的参数对象");
参数对象.公用参数生成方法("我的参数") //至于如何解析参数在对象内部自己完成


构造函数(参数对象基类 obj)

//这样把变化封装在外面就可以统一调用, 修改也只是修改自己继承过来的参数对象方法。


第二种方式,采用IOC容器动态的直接注入方法,比如你可以使用Unity这个小型的ioc容器类

使用方式
Container
.RegisterInstance<参数对象>(参数对象实例) //把参数对象实例注入容器
.Resolve<要生成的对象类型>();//调用生成实例,这里实际等同于 new 要生成的对象类型(参数对象)
criedshy 2010-03-31
  • 打赏
  • 举报
回复
是的,我也打算自己构造一个参数数组, 但是我怎么可以知道构造函数的参数个数,参数对应的类型呢??谢谢.

你都不知道你怎么调用,既然这样,你还不如写一个无参数的构造器呢
criedshy 2010-03-31
  • 打赏
  • 举报
回复
参数类型不对啊
tank_2009 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 wanghui0380 的回复:]
你的参数传递有误

txtBuildParam.Text.Split(',') 结果是string[]

而构造函数为
public ClsBOFAngle(string sID1, object o1, string sID2, object o2, double dIni, int iSpeed)

很明显参数不全是string,所以string[]的参数系统找不相匹配的 函数签……
[/Quote]

是的,我也打算自己构造一个参数数组, 但是我怎么可以知道构造函数的参数个数,参数对应的类型呢??谢谢.
wanghui0380 2010-03-31
  • 打赏
  • 举报
回复
你的参数传递有误

txtBuildParam.Text.Split(',') 结果是string[]

而构造函数为
public ClsBOFAngle(string sID1, object o1, string sID2, object o2, double dIni, int iSpeed)

很明显参数不全是string,所以string[]的参数系统找不相匹配的 函数签名

解决方法,自己构造object[] 参数传递。可参考13楼的代码
cjcgy 2010-03-31
  • 打赏
  • 举报
回复
自己反射找构造函数, 然后invoke。
不用CreateInstance。

应该可以。
tank_2009 2010-03-31
  • 打赏
  • 举报
回复
UP.
tank_2009 2010-03-30
  • 打赏
  • 举报
回复
这个类并没有无参的构造函数, 只是为了测试程序,我增加了一个而已...

是因为构造函数参数的类型有 double, 和int ,
而我所传的参数 txtBuildParam.Text.Split(',') 全为string,能有好的办法转换一下吗?
wiki14 2010-03-30
  • 打赏
  • 举报
回复
难道是我理解错了?你需要传参数的时候,调用有参数的构造函数啊?
无参的那个是默认的构造函数啊~

类或结构可能有多个接受不同参数的构造函数。
tank_2009 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wiki14 的回复:]
重载构造函数啊?
[/Quote]

但是这个类,还是得传参数进去啊..使用无参的构造函数,对于这个类来说是没有任何意思的
wiki14 2010-03-30
  • 打赏
  • 举报
回复
重载构造函数啊?
tank_2009 2010-03-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuyq11 的回复:]
IObjcet obj=(IObjcet)Activator.CreateInstance(System.Type .GetType ("命名空间.类,ActivatorExample" ),null);

IObjcet obj2=(IObjcet)System.Activator .CreateInstance (System.Type .GetType ("命名空间.类,Activato……
[/Quote]

还是没有解决,我用提动态编译,得到的Assembly,似乎不能用Activator .CreateInstance

我这段代码报错,是因为构造函数参数的类型有 double, 和int ,
而我所传的参数 txtBuildParam.Text.Split(',') 全为string,能有好的办法转换一下吗?
加载更多回复(5)

111,098

社区成员

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

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

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