如:
public class Base{}
public class ClassA : Base{}
用反射如
object obj = Assembly.CreateInstance( "ClassA" );
此时成功.但在
Base info = (Base)obj时却失败,错误为转换无效。
为何呢,
public class Base{}
public class ClassA : Base{}
用反射如
object obj = Assembly.CreateInstance( "ClassA" );
此时成功.但在
Base info = (Base)obj时却失败,错误为转换无效。
为何呢,
Assembly已读取完成,上面只是为了简便没有写全部的代码,
Base类在那里定义的?
在代码上最好先检测一下,如:
object obj = Assembly.CreateInstance( "ClassA" );if (obj is Base)
{
Base info = (Base)obj
}或Base info = obj as Base;
if (info!=null)
{
....
}
ClassLibrary1.Base bs = (ClassLibrary1.Base)obj;
这样转换是没有问题的,因为同属于一个程序集...
试试下面这个
String reflectType = "ClassA";
Type type = Type.GetType(reflectType, true);
Base ba = (Base)Activator.CreateInstance(type);
首先说明这个项目是WEB的,
刚才我在WINFORM中测试了下,转换是没有问题的。
To liujia_0421(SnowLover) :
创建ClassA的程序集文件和项目中引用的程序集是同一个文件.
object obj = Assembly.CreateInstance( "ClassA" );
ClassA info = (ClassA)obj;
Base bs = (Base)info;
刚才我在WINFORM中测试了下,转换是没有问题的。有点奇怪,没遇到过..关注一下..
我试过了,ClassA info = (ClassA)obj;就已经引发转换异常了.
此时成功.但在
ClassA info = (ClassA)obj时却失败,错误为转换无效。是不是obj为null呢?
obj不为空,已测试过
ClassA info = (ClassA)obj之前显示输出obj的信息是正确的.只是一转换就失败,我说一下项目引用吧
ProjectClass:实体类信息类库
Factory:创建实体类类库
Website:在此项目中调用Factory创建ProjectClass中的类对象,刚才我做了一个测试,如果将ProjectClass中的类信息放到Website中,再在Website中用反射创建可以转换,
如果不这么做,仍然用Factory创建,则可将创建的object对象转换为ProjectClass中定义的接口,但无法转换为对象
郁闷那
可能你两边使用的ClassA不是同一个版本所引起的错误.你可以把ClassA换成一个接口来使用.这样就应没有问题了!
版本相同,引用的是同一个文件
To hertcloud(·£孙子兵法£·) :
是完整的命名空间
下面是创建对象的过程:
object obj = PWMIS.Service.CacheService.AssemblyEntityObject.CreateInstance
( "PWMIS.Entity.CMenuConfig" );此处没有问题
AssemblyEntityObject是Assembly对象
Response.Write( obj.GetType().FullName );此处输出的是PWMIS.Entity.CMenuConfig
-----------------输出结果说明建立的对象类型是PWMIS.Entity.CMenuConfig,
这个类是ClassA,或从ClassA继承吗?如果不是当然
Base info = (Base)obj
转换无效。
if(obj is Base)
{
Response.Write( "True" );
}
他的意思是,最上面说的是例子,刚才贴的是项目中的源码
if(obj is Base)
{
Base bObj = obj as Base;
}
ClassA classA= (ClassA )obj;
Base Info=(Base)classA;
----------------------
支持!
--------------------------------
这个怎么才能做到?或者说一个project里有2个assemly怎么实现?
Assembly加载后以后对Assembly的对象进行监视,看看里面的文件的路径是什么,是不是和你需要转换到的这个文件所在的路径一样。如果是一样,那就说明你发达了,马上向微软举报,说发现bug
我也曾经碰到过这样的问题,后来调试才发现是路径不正确。
是同一个程序集文件,
项目引用是Entity项目的程序集,
创建对象引用的是web/bin/Entity文件
但是在运行时,Entity下的文件和web/bin/的Entity文件应该是一个,
我试了让Web引用的文件和bin下的文件是一个文件,但仍然无效.
Type c = asm.GetType("ClassA");
object Instance = asm.CreateInstance(c.FullName);
Base Info=(Base)Instance;
楼主试一下
Type c = asm.GetType("ClassA");
object Instance = asm.CreateInstance(c.FullName);
Base Info=(Base)Instance;----------------------------------
支持这个。我有一段从微软给出来的代码,其中遇到反射的时候全都使用type.gettype()获得全名!
如
Assembly asm = Assembly.LoadFile( @"E:\PROJECT\PWMIS\Entity\bin\Debug\Entity.dll" );
Type tp = asm.GetType( "PWMIS.Entity.CMenuConfig" );
object obj = asm.CreateInstance( tp.FullName );
Response.Write( asm.Location + "<br>" );
if( obj != null )
Response.Write( obj.ToString() );
else
Response.Write( "null" );
if( obj is PWMIS.Entity.CMenuConfig )
Response.Write( "<b>true</b>" );
else
Response.Write( "<b>false</b>" );
以上输出false
但是obj.ToString确仍然输出PWMIS.Entity.CMenuConfig
把前两行改成以下两行试试:
Type tp = Type.GetType( "PWMIS.Entity.CMenuConfig" );
Assembly asm = tp.Assembly;
//我不去加载程序集,是因为楼主说项目已经引用了,应该这样也能找到类吧?
这问题确实够奇怪,反正我在web下也用过反射,但没遇见过这种情况。
注意要添加引用
Amwpfiqvy(给我分吧,让我升仙):
确实是你说的这种情况,虽然装载的是同一个文件,但是在内存中确实两块不同的区域.
另外,在Load时要使用全名,即"Entity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"种形式.
谢谢各位,结贴了