急!!反射后不能转换到基类的问题?
如:
public class Base{}
public class ClassA : Base{}
用反射如
object obj = Assembly.CreateInstance( "ClassA " );
此时成功.但在
Base info = (Base)obj时却失败,错误为转换无效。
为何呢,
------解决方案--------------------你那段代码我运行不了
试试下面这个
String reflectType = "ClassA ";
Type type = Type.GetType(reflectType, true);
Base ba = (Base)Activator.CreateInstance(type);
------解决方案--------------------TO:首先说明这个项目是WEB的,
刚才我在WINFORM中测试了下,转换是没有问题的。
有点奇怪,没遇到过..
关注一下..
------解决方案--------------------u0p
------解决方案--------------------object obj = Assembly.CreateInstance( "ClassA " );
ClassA前面 加上 完整的 名空间
------解决方案--------------------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;
}
------解决方案--------------------没遇见过
------解决方案--------------------或者输出基类名称。用反射。
------解决方案--------------------碰见这种疑难杂症,最好的办法就是简化程序运行环境,逐步排除错误。可以建一个简单的空白项目,然后比照真实项目将各种设置一点点加上去,一般都能找到问题根源。
------解决方案--------------------虽然是同一个文件,但不是同一个assembly
------解决方案--------------------web的目录结构是怎么样的?那个导入的DLL的路径又是什么?
------解决方案--------------------Assembly asm = Assembly.LoadFile( 程序集.dll);
Type c = asm.GetType( "ClassA ");
object Instance = asm.CreateInstance(c.FullName);
Base Info=(Base)Instance;
楼主试一下
------解决方案--------------------你只要调试进入程序看看你的Assembly的对象加载的程序集是哪一个,也就是路径,然后核对和该段代码所在的程序下对该Assembly的引用的路径是否一致,如果不一致,那就错了
------解决方案--------------------Assembly asm = Assembly.LoadFile( 程序集.dll);
Type c = asm.GetType( "ClassA ");
object Instance = asm.CreateInstance(c.FullName);
Base Info=(Base)Instance;
----------------------------------
支持这个。我有一段从微软给出来的代码,其中遇到反射的时候全都使用type.gettype()获得全名!
------解决方案--------------------虽然引用的是同一个文件,但在内存中却是处于两个不同的程序集中,这就是问题关键所在.
把前两行改成以下两行试试:
Type tp = Type.GetType( "PWMIS.Entity.CMenuConfig " );
Assembly asm = tp.Assembly;
//我不去加载程序集,是因为楼主说项目已经引用了,应该这样也能找到类吧?
------解决方案--------------------