c#中CreatInstance怎么传递泛型?

深度思索 2013-05-23 02:29:11
//这是我dll文件的简写

NameSpace polygon_Component

{

public struct Save
{
public int name;
}


public class Polygon
{

Form fm;

List<Save>list;

public Polygon(Form fm,List<Save > list)
{
this.list = list;
this.fm=fm;
}

}

}

然后我在主程序中调用

List<Save> savef = new List<Save>();

private void Form1_Load(object sender, EventArgs e)
{ Object[] parameters = new Object[2];
parameters[0] = this;
parameters[1] = savef;

Assembly asm = Assembly.Load("UITestDesignTools1.0");//加载反射的dll

object polygon = ass.CreateInstance("Polygon", true, System.Reflection.BindingFlags.Default, null, parameters, null, null);
}

每次运行到最后那条语句时,都报错“"未找到类型“Polygon_Component.Polygon”上的构造函数。”? 改成Activator时,又报出同样的错误。在构造函数里,我仅传递一个fm类型却又可以了,这是泛型参数导致的吗?

...全文
377 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
我要坚强 2013-05-27
  • 打赏
  • 举报
回复
我看错了 Assembly asm = Assembly.Load("UITestDesignTools1.0"); Type tsave = asm.GetType("polygon_Component.Save"); Assembly.Load 为什么你不去load polygon_Component而是UITestDesignTools1.0,还是前面说的Save在clr中不是两个相同的save
我要坚强 2013-05-27
  • 打赏
  • 举报
回复

 public Polygon(Form fm,object obj)
        {
List<Save> list=obj as List<Save>; 
            this.list = list;
            this.fm=fm;           
        }
也行的不过Save 必须和Polygon在一个文件中也就是引用版本命名空间必须一致
深度思索 2013-05-27
  • 打赏
  • 举报
回复
引用 11 楼 u010383116 的回复:

 public Polygon(Form fm,object obj)
        {
List<Save> list=obj as List<Save>; 
            this.list = list;
            this.fm=fm;           
        }
也行的不过Save 必须和Polygon在一个文件中也就是引用版本命名空间必须一致
非常感谢,,还是这一招好用! 多谢各位的帮忙,愿大家吃好喝好!
深度思索 2013-05-26
  • 打赏
  • 举报
回复
各位实在抱歉,,,这两天有点事,没能及时回帖,还请原谅。 今天又试了一下,表示真心不知道怎么回事了: 1,我在同一个程序集下编辑Polygon(和原先的dll文件完全相同)时,而且引用的也是原先分离的Save结构 dll文件,然后Activator.CreateInstance(typeof(Polygon),this,list)方法就可以用了。但是,当我再分离成dll文件时,就又不行了。。。不知道怎么回事? 2,至于用MakeGenericType创建泛型类,我没学过,在网上只查它一般都是创建开放性泛型类,如果是那样的话,我在数据处理方面就会很麻烦,要做很大的变动,不知道怎么解决这个封闭型的泛型? 先行谢过~~~~
我要坚强 2013-05-25
  • 打赏
  • 举报
回复
真奇怪我今天测了一下提外面是可以的呀
   Assembly asm = Assembly.Load("UITestDesignTools1.0");        
            Type tPolygon = asm.GetType("polygon_Component.Polygon");         
          
            List<ClassLibrary2.Saves> param2 = new List<ClassLibrary2.Saves>();
            param2.Add(new ClassLibrary2.Saves() { name = 1001 });
            object my = Activator.CreateInstance(tPolygon, new Object[] { this, param2 });
threenewbee 2013-05-24
  • 打赏
  • 举报
回复
引用 7 楼 u010807669 的回复:
偶,我快崩溃了。。。我把public struct Save提到了外面做成了dll文件,然后Polygon_component和主程序都引用这个文件,但是运行之后仍然报出同样的错误。至于用dynamic关键字,我好不容易学完它,没想到我在我的vs2008上找不到System.Dynamic这个命名空间的引用,貌似这是后来才加的。。。求各位大神有没有更好的办法~~~?先行谢过~~~
我不是告诉你了么?什么人说“用不到”。
深度思索 2013-05-24
  • 打赏
  • 举报
回复
偶,我快崩溃了。。。我把public struct Save提到了外面做成了dll文件,然后Polygon_component和主程序都引用这个文件,但是运行之后仍然报出同样的错误。至于用dynamic关键字,我好不容易学完它,没想到我在我的vs2008上找不到System.Dynamic这个命名空间的引用,貌似这是后来才加的。。。求各位大神有没有更好的办法~~~?先行谢过~~~
我要坚强 2013-05-24
  • 打赏
  • 举报
回复
如果你不想把public struct Save提到外面,你可以参照下面的方法修改,虽然下面的方法傻了八圾的,但说明了你所谓的两个save根本就是两个save而不是相同一个save这个概念

 Assembly asm = Assembly.Load("UITestDesignTools1.0");
            //得到结构体Type
            Type tsave = asm.GetType("polygon_Component.Save");
            //给结构体赋值
            dynamic param1 = Activator.CreateInstance(tsave);
            param1.name = 12;
            //得到Polygon类
            Type tPolygon = asm.GetType("polygon_Component.Polygon");
            //得到构造函数最后一个参数类型
            var constructor = tPolygon.GetConstructors().Single().GetParameters().Last().ParameterType;
            //实例化参数List<Save>
            dynamic listParam1 = Activator.CreateInstance(constructor);
            listParam1.Add(param1);
            //实例化Polygon类
            object obj = Activator.CreateInstance(tPolygon, new Object[] { this, listParam1 });
予沁安 2013-05-23
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
先用MakeGenericType创建泛型类型,然后再CreateInstance。
还用不到这个。
予沁安 2013-05-23
  • 打赏
  • 举报
回复
引用 2 楼 u010807669 的回复:
"List<Save> savef 引用跟 public Polygon(Form fm,List<Save > list) 引用两者的Save类型不一样了"是什么意思? 我在主程序中也定义了这个"Save" struct,而且代码是复制过去的
这就是你楼上说的问题,你定义了两个Save,是不同的东西。
threenewbee 2013-05-23
  • 打赏
  • 举报
回复
先用MakeGenericType创建泛型类型,然后再CreateInstance。
深度思索 2013-05-23
  • 打赏
  • 举报
回复
"List<Save> savef 引用跟 public Polygon(Form fm,List<Save > list) 引用两者的Save类型不一样了"是什么意思? 我在主程序中也定义了这个"Save" struct,而且代码是复制过去的
我要坚强 2013-05-23
  • 打赏
  • 举报
回复
应该不是泛型引起的,反射可以用泛型的 public struct Save { public int name; } 可能List<Save> savef 引用跟 public Polygon(Form fm,List<Save > list) 引用两者的Save类型不一样了。如果你把 public struct Save { public int name; }提到外面别的程序集里或许不出错了

110,533

社区成员

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

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

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