如:
public class Base{}
public class ClassA : Base{}
用反射如
object obj = Assembly.CreateInstance( "ClassA" );
此时成功.但在
Base info = (Base)obj时却失败,错误为转换无效。
为何呢,

解决方案 »

  1.   

    return (Base)Assembly.Load(path).CreateInstance(className);
      

  2.   

    To michney(小马) :
    Assembly已读取完成,上面只是为了简便没有写全部的代码,
      

  3.   

    你的代码应该没有问题,
    Base类在那里定义的?
      

  4.   

    在用法上应该没有问题,你看一下是不是哪里出了错.
    在代码上最好先检测一下,如:
    object obj = Assembly.CreateInstance( "ClassA" );if (obj is Base)
    {
        Base info = (Base)obj
    }或Base info = obj as Base;
    if (info!=null)
    {
        ....
    }
      

  5.   

    我想楼主是不是这样用的?你Load这个程序集后,在程序中又添加了这个程序集的引用?两个程序集并不是同一个..你的object obj = Assembly.CreateInstance( "ClassA" );得到的是一个ClassA的实例,而你要转换成的Base,却与这个ClassA属于不同的程序集...只是猜测,不知道我有没有说清楚...
      

  6.   

    这样试一下,在当前项目中添加程序集引用,然后Load时直接取当前项目中的(添加引用时就会拷贝一份到当前项目中)..            Object obj = Assembly.LoadFrom(@"ClassLibrary1.dll").CreateInstance("ClassLibrary1.ClassA");
                ClassLibrary1.Base bs = (ClassLibrary1.Base)obj;
    这样转换是没有问题的,因为同属于一个程序集...
      

  7.   

    你那段代码我运行不了
    试试下面这个
              
                String reflectType = "ClassA";
                Type type = Type.GetType(reflectType, true);
                Base ba = (Base)Activator.CreateInstance(type);
      

  8.   

    谢谢各位的答复,
    首先说明这个项目是WEB的,
    刚才我在WINFORM中测试了下,转换是没有问题的。
    To liujia_0421(SnowLover) :
    创建ClassA的程序集文件和项目中引用的程序集是同一个文件.
      

  9.   

    间接转换呢
    object obj = Assembly.CreateInstance( "ClassA" );
    ClassA info = (ClassA)obj;
    Base bs = (Base)info;
      

  10.   

    TO:首先说明这个项目是WEB的,
    刚才我在WINFORM中测试了下,转换是没有问题的。有点奇怪,没遇到过..关注一下..
      

  11.   

    To liujia_0421(SnowLover):
    我试过了,ClassA info = (ClassA)obj;就已经引发转换异常了.
      

  12.   

    这样能成功吗?object obj = Assembly.CreateInstance( "ClassA" );
    此时成功.但在
    ClassA info = (ClassA)obj时却失败,错误为转换无效。是不是obj为null呢?
      

  13.   

    To hbxtlhx(平民百姓):
    obj不为空,已测试过
    ClassA info = (ClassA)obj之前显示输出obj的信息是正确的.只是一转换就失败,我说一下项目引用吧
    ProjectClass:实体类信息类库
    Factory:创建实体类类库
    Website:在此项目中调用Factory创建ProjectClass中的类对象,刚才我做了一个测试,如果将ProjectClass中的类信息放到Website中,再在Website中用反射创建可以转换,
    如果不这么做,仍然用Factory创建,则可将创建的object对象转换为ProjectClass中定义的接口,但无法转换为对象
    郁闷那
      

  14.   

    查看一下obj的类型:object obj = Assembly.CreateInstance( "ClassA" );System.Console.WriteLine(obj.GetType().FullName);
      

  15.   

    object obj = Assembly.CreateInstance( "ClassA" );ClassA前面 加上 完整的 名空间
      

  16.   

    想到一个问题,
    可能你两边使用的ClassA不是同一个版本所引起的错误.你可以把ClassA换成一个接口来使用.这样就应没有问题了!
      

  17.   

    Assembly是怎么来的?应该是版本问题……
      

  18.   

    To hbxtlhx(平民百姓),Ivony()  :
    版本相同,引用的是同一个文件
    To hertcloud(·£孙子兵法£·) :
    是完整的命名空间
    下面是创建对象的过程:
    object obj = PWMIS.Service.CacheService.AssemblyEntityObject.CreateInstance
    ( "PWMIS.Entity.CMenuConfig" );此处没有问题
    AssemblyEntityObject是Assembly对象
    Response.Write( obj.GetType().FullName );此处输出的是PWMIS.Entity.CMenuConfig
      

  19.   

    Response.Write( obj.GetType().FullName );此处输出的是PWMIS.Entity.CMenuConfig
    -----------------输出结果说明建立的对象类型是PWMIS.Entity.CMenuConfig,
    这个类是ClassA,或从ClassA继承吗?如果不是当然
    Base info = (Base)obj
    转换无效。
      

  20.   

    如果是那样。你再多试一下,
    if(obj is Base)
    {
        Response.Write( "True" );
    }
      

  21.   

    To hbxtlhx(平民百姓):
    他的意思是,最上面说的是例子,刚才贴的是项目中的源码
      

  22.   

    如果你判断一下
    if(obj is Base)
    {
        Base bObj = obj as Base;
    }
      

  23.   

    虽然是同一个文件,但不是同一个assembly
      

  24.   

    object obj = Assembly.CreateInstance( "ClassA" );
    ClassA classA= (ClassA )obj;
    Base Info=(Base)classA;
      

  25.   

    虽然是同一个文件,但不是同一个assembly
    ----------------------
    支持!
      

  26.   

    虽然是同一个文件,但不是同一个assembly
    --------------------------------
    这个怎么才能做到?或者说一个project里有2个assemly怎么实现?
      

  27.   

    我觉得也应该不是同一个assembly的关系,我也曾经碰到过这样的问题,你可以进入调试,在你
    Assembly加载后以后对Assembly的对象进行监视,看看里面的文件的路径是什么,是不是和你需要转换到的这个文件所在的路径一样。如果是一样,那就说明你发达了,马上向微软举报,说发现bug
    我也曾经碰到过这样的问题,后来调试才发现是路径不正确。
      

  28.   

    web的目录结构是怎么样的?那个导入的DLL的路径又是什么?
      

  29.   

    谢谢各位的解答,
    是同一个程序集文件,
    项目引用是Entity项目的程序集,
    创建对象引用的是web/bin/Entity文件
    但是在运行时,Entity下的文件和web/bin/的Entity文件应该是一个,
    我试了让Web引用的文件和bin下的文件是一个文件,但仍然无效.
      

  30.   

    Assembly   asm   =   Assembly.LoadFile( 程序集.dll); 
    Type c = asm.GetType("ClassA");
    object Instance = asm.CreateInstance(c.FullName);
    Base Info=(Base)Instance;

    楼主试一下
      

  31.   

    你只要调试进入程序看看你的Assembly的对象加载的程序集是哪一个,也就是路径,然后核对和该段代码所在的程序下对该Assembly的引用的路径是否一致,如果不一致,那就错了
      

  32.   

    Assembly   asm   =   Assembly.LoadFile( 程序集.dll); 
    Type c = asm.GetType("ClassA");
    object Instance = asm.CreateInstance(c.FullName);
    Base Info=(Base)Instance;----------------------------------
    支持这个。我有一段从微软给出来的代码,其中遇到反射的时候全都使用type.gettype()获得全名!
      

  33.   

    谢谢各位,刚才我又测试了一下,即使创建程序集的文件和web引用的文件是同一个文件,也转换不了.

    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
      

  34.   

    虽然引用的是同一个文件,但在内存中却是处于两个不同的程序集中,这就是问题关键所在.
    把前两行改成以下两行试试:
    Type tp = Type.GetType( "PWMIS.Entity.CMenuConfig" );
    Assembly asm = tp.Assembly;
    //我不去加载程序集,是因为楼主说项目已经引用了,应该这样也能找到类吧?
      

  35.   

    比较obj.GetType()和typeof(PWMIS.Entity.CMenuConfig)看看?
    这问题确实够奇怪,反正我在web下也用过反射,但没遇见过这种情况。
      

  36.   

    是在Assembly.Load(path)的时候没有得到相关值,我现在也碰到这个问题,楼主解决了请发个短消息给我!
      

  37.   

    我已经成功解决了,应该是这种格式:return (Base)Assembly.Load(path).CreateInstance(path.className);
    注意要添加引用
      

  38.   

    To oldmoon(电子商务人,电子商务路):
    Amwpfiqvy(给我分吧,让我升仙):
    确实是你说的这种情况,虽然装载的是同一个文件,但是在内存中确实两块不同的区域.
    另外,在Load时要使用全名,即"Entity, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"种形式.
    谢谢各位,结贴了