反射之Assembly与Activator区别

Assembly.CreateInstance 方法 (String)
使用区分大小写的搜索,从此程序集中查找指定的类型,然后使用系统激活器创建它的实例。

Activator.CreateInstance 方法 (Type)
使用与指定参数匹配程度最高的构造函数来创建指定类型的实例。

注意:反射的类的程序集dll必须存在于web层的bin下。

例子一:
//从程序集创建对象实例
 string path = System.Configuration.ConfigurationSettings.AppSettings["DAL"];//数据层的程序集名称
 return (IDbObject)Assembly.Load(path).CreateInstance(path+".DbObject");

 //使用与指定参数匹配程度最高的构造函数来创建指定类型的实例
 string path = System.Configuration.ConfigurationSettings.AppSettings["DAL"];
 string TypeName=path+".DbObject"
 Type objType = Type.GetType(TypeName,true);
 return (IDbObject)Activator.CreateInstance(objType);

例子二:
假设有类如下:
namespace WebApp2010
{
    public class UserProfilerService: IUserProfiler
    {
        public string GetUserProfiler(string UserId)
        {
            if (UserId == "A001")
                return "Bob";
            else return string.Empty;
        }
    }
}

反射创建类的实例:
Type t = Type.GetType("WebApp2010.UserProfilerService");
IUserProfiler result = (IUserProfiler)Activator.CreateInstance(t);
Response.Write(result.GetUserProfiler("A001"));
IUserProfiler result1 = (IUserProfiler)Activator.CreateInstance(typeof(UserProfilerService));
Response.Write(result1.GetUserProfiler("A001"));
IUserProfiler result2 = (IUserProfiler)Assembly.Load("WebApp2010").CreateInstance("WebApp2010.UserProfilerService");
Response.Write(result2.GetUserProfiler("A001"));

例子三:
TradeSite.WebSiteSet.BLL.EmailQueue bll = (TradeSite.WebSiteSet.BLL.EmailQueue)Assembly.Load("TradeSite.WebSiteSet.Component").CreateInstance("TradeSite.WebSiteSet.BLL.EmailQueue");
bll.InsertData(emailinfo);
需要注意的是创建格式:Assembly.Load(程序集名称).CreateInstance(命名空间.类名)

附:关于Assembly类的说明
Assembly类可以获得正在运行的装配件信息,也可以动态的加载装配件,以及在装配件中查找类型信息,并创建该类 型的实例。Type类可以获得对象的类型信息,此信息包含对象的所有要素:方法、构造器、属性等等,通过Type类可以得到这些要素的信息,并且调用之。 MethodInfo包含方法的信息,通过这个类可以得到方法的名称、参数、返回值等,并且可以调用之。诸如此类,还有FieldInfo、 EventInfo等等,这些类都包含在System.Reflection命名空间下。
来源:http://hi.baidu.com/zbphot/item/30ca2a506f71e3acacc8574c

posted @ 2018-10-08 16:16  skybirdzw  阅读(606)  评论(0编辑  收藏  举报