• 通过反射动态实例化对象中出现的一个奇怪问题


    在.Net中通过反射,可以对程序集进行很多操作。现在我希望通过动态加载程序集,并将该程序集中的一个类对象进行实例化。然后将获得这个object对象通过强制转换,转换为具体的类对象,以达到调用其方法的目的。

    我要加载的程序集很简单,只有一个类,且类里面只有一个公有属性和一个公共方法。代码如下:

    using System;

    namespace AutoObject
    {
      
    public class TestObject
        
    {
            
    public string name;

            
    public TestObject()
            
    {
                name = "wayfarer";
            }


            
    public void Print(string s)
            
    {
                name 
    = s;
                Console.WriteLine(name);
            }


        }

    }

    程序集名为AutoObject.dll,路径假设为”e:\”。命名空间为AutoObject,类名为TestObject。

    然后我编写一个控制台应用程序来动态加载它:

    using System;
    using System.Reflection;

    namespace UseReflector
    {    
        
    class Class1
        
    {
            
            [STAThread]
            
    static void Main(string[] args)
            
    {
                
    object obj = CreateObject(@"e:\AutoObject.dll");
                AutoObject.TestObject test 
    = (AutoObject.TestObject)obj;
                test.Print(
    "I love you!");
                Console.ReadLine();
            }


            
    public static object CreateObject(string assemblyFile)
            
    {
                Assembly assembly 
    = Assembly.LoadFrom(assemblyFile);
                Type type 
    = assembly.GetType("AutoObject.TestObject");
                
                
    object obj = Activator.CreateInstance(type);
                
    return obj;
            }

        }

    }

    主方法是CreateObject()。

    首先通过Assembly.LoadFrom()加载该程序集,然后通过GetType()方法获得指定类名的对象类型。此时type的name为AutoObject.TestObject。

    然后通过Activator.CreateInsatance(type),来调用构造函数获得该类对象的实例,返回object类型对象。

    然后再Main()中,将上述方法创建的对象强制转换为AutoObject.TestObject类型。当然,我在控制台程序中又手工添加了对AutoObject.dll的引用。最后调用转换后的对象test的Print()方法。

    运行,结果抛出异常“指定的转换无效。”

    我用断点调试,在执行CreateObject()方法的最后一句:return obj时,得到obj的信息是:

    obj的值是{AutoObject.TestObject},类型为System.Object。同时还看到类对象的属性name,其值为“wayfarer“,类型为string。显然它是和TestObject类对象符合的啊,为什么不能转换呢?

    我在Main()中引入了另一个实例:
    object obj2 = new AutoObject.TestObject();
    再将前面创建好的obj赋给obj2,再对obj2进行如前的转换:
    AutoObject.TestObject test = (AutoObject.TestObject)obj2;

    结果报告的错误是一样的。但我经过断点调试,发现obj和obj2两个对象的调试信息都和上面一样,可为什么结果同样是错误的呢?

    但如果我把前面获得的type改为直接从类对象获得,运行就正常了。

    原来的:Type type = assembly.GetType("AutoObject.TestObject");

    修改后: Type type = typeof(AutoObject.TestObject);
     
    这又是为什么?事实上两种方法获得的type都是AutoObject.TestObject类型啊?

    真实百思不得其解!

  • 相关阅读:
    Java连接操作redis
    redis 6.0.x简介和安装
    设计模式之代理模式(proxy)
    设计模式之组合模式(composize)
    Linux Shell脚本调试方法
    linuxcfg.sh
    反向代理和正向代理区别
    WAF与IPS的区别总结
    【LemonCK】jQuery的基本使用
    【LemonCK】CSS盒子塌陷问题
  • 原文地址:https://www.cnblogs.com/wayfarer/p/25968.html
Copyright © 2020-2023  润新知