日期:2014-05-20  浏览次数:20839 次

急!!反射后不能转换到基类的问题?
如:
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;
//我不去加载程序集,是因为楼主说项目已经引用了,应该这样也能找到类吧?
------解决方案--------------------