实现是没办法了, 向大家求且. 关于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)


请大家帮忙 .谢谢.
...全文
681 25 打赏 收藏 转发到动态 举报
写回复
用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,120

社区成员

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

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

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