关于反射的问题

lyl_rabbit 2004-11-24 03:24:54
Assembly a = Assembly.LoadFrom(@"E:\TestColumnDragDataGrid.exe");
object o = a.CreateInstance("TestColumnDragDataGrid.ClassB");

上面这一句是正确的,但下面这一句就不正确,为什么?

Assembly ass = Assembly.LoadFrom(@"E:\System.Windows.Forms.dll");
object examObject = ass.CreateInstance("System.Windows.Forms.TextBox");
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
System.Windows.Forms.Control ct = (System.Windows.Forms.Control)examObject;

实际上~~~这一句就已经出错,但没有提示

请大侠解说一下:
...全文
189 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyl_rabbit 2004-11-24
  • 打赏
  • 举报
回复
知道了,结!!!!!!!!!!!!!!!!!!!!111
lyl_rabbit 2004-11-24
  • 打赏
  • 举报
回复
To: jimh(jimmy)就算第2句不对,第一句应该是对的吧,可是第一名虽然系统没有抛出异常,但如果观察返回的对象的话,可以发现对象内部的属性有的是不正常的


object examObject = ass.CreateInstance("System.Windows.Forms.TextBox");
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
System.Windows.Forms.Control ct = (System.Windows.Forms.Control)examObject;
brightheroes 2004-11-24
  • 打赏
  • 举报
回复
既然类型都不一样,当然无法转换
好像也没有这样用文本框的吧
一般来说
反射得到的对象,是不会做转换的
转换,就表示知道是什么对象
既然知道了,为什么不直接new
还用反射干什么
一般都是如jimh(jimmy) 所言
Invoke方法之类的
amendajing 2004-11-24
  • 打赏
  • 举报
回复
mark
lyl_rabbit 2004-11-24
  • 打赏
  • 举报
回复
o.GetType() == sender.GetType() 比较的是对象,不相同是应该的吧

我写的是 o.GetType().ToString() == sender.GetType().ToString()
jimh 2004-11-24
  • 打赏
  • 举报
回复
从外部assembly动态创建的对象,只能使用Invoke来访问,一般不能转换为特定的类型,引用的文件不同,虽然是同一个命名空间,但代表的对象不一样,除非当前应用程序引用的是同一个文件。
brightheroes 2004-11-24
  • 打赏
  • 举报
回复
起码我的机器上,类型不匹配。
lyl_rabbit 2004-11-24
  • 打赏
  • 举报
回复
if ( o.GetType().ToString() == sender.GetType().ToString())
{
MessageBox.Show("类型匹配!");
}
else
{
MessageBox.Show("类型不匹配!");
}

结果是【类型匹配!】
lyl_rabbit 2004-11-24
  • 打赏
  • 举报
回复
另 我说的 没有提示,是指系统没有抛出异常,但如果观察返回的对象的话,可以发现对象内部的属性有的是不正常的
lyl_rabbit 2004-11-24
  • 打赏
  • 举报
回复
Assembly a = Assembly.LoadFrom(@"E:\TestColumnDragDataGrid.exe");
object o = a.CreateInstance("TestColumnDragDataGrid.ClassB");


ClassB cb = (ClassB)o;

是正确的啊,为什么换成TextBox就不行了呢
brightheroes 2004-11-24
  • 打赏
  • 举报
回复
不会没有提示,应该是 转换无效的异常
to 楼上的

System.Windows.Forms.Control是当前的已经加载了的dll里面的


object examObject = ass.CreateInstance("System.Windows.Forms.TextBox");
是从另外一个Assembly里面获取的

这么转换,肯定8行
xum1983 2004-11-24
  • 打赏
  • 举报
回复
To: brightheroes(闭关|那一剑的风情)

楼主的
object examObject = ass.CreateInstance("System.Windows.Forms.TextBox");
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
System.Windows.Forms.Control ct = (System.Windows.Forms.Control)examObject;

只是简单的装箱与拆箱,应该没有类型问题呀
brightheroes 2004-11-24
  • 打赏
  • 举报
回复
string s = @"C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Windows.Forms.dll";
Assembly a = Assembly.LoadFile(s);
Type t = a.GetType("System.Windows.Forms.Button");
object o = System.Activator.CreateInstance(t);

if ( o.GetType() == sender.GetType())
{
MessageBox.Show("类型匹配!");
}
else
{
MessageBox.Show("类型不匹配!");
}

楼主运行一下这个程序
结果是【类型不匹配!】
lyl_rabbit 2004-11-24
  • 打赏
  • 举报
回复
object examObject = ass.CreateInstance("System.Windows.Forms.TextBox");

中的"System.Windows.Forms.TextBox"是保存在变量中的,所以才有这样的要求
也可能是"System.Windows.Forms.ComboBox",生成后的object可以转换为System.Windows.Forms.Control

lyl_rabbit 2004-11-24
  • 打赏
  • 举报
回复
已经有了,但就是要这样执行,为什么不行呢
xum1983 2004-11-24
  • 打赏
  • 举报
回复
你的异常是什么类型的?
trueidle 2004-11-24
  • 打赏
  • 举报
回复
System.Windows.Forms.dll在全局系统缓存中已经有,既然已经引用,无需这样执行。如果没有引用第三句无法执行
lyl_rabbit 2004-11-24
  • 打赏
  • 举报
回复
在线等待

110,534

社区成员

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

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

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