使用反射技术动态创建类对象时引用其它项目中DAL的方法
下午看到jumpsfire朋友问到了一个问题,在不同的项目中使用反射技术时,会出现错误提示。这里简单介绍一下不同项目中使用反射需要注意的地方。
首先给出代码,如果反射代码需要被不同项目引用的话,那么在app.config(或web.config)中,需要增加一行参数。
<!--新增参数-->
<add key="ksRBAC_DALFile" value="ksRBAC.SQLServerDAL"/>
<!--原有参数,用于设置连接何种数据源-->
<add key="ksRBAC_DataAccessLayer" value="SQLServerDAL"/>
<add key="ksRBAC_DALFile" value="ksRBAC.SQLServerDAL"/>
<!--原有参数,用于设置连接何种数据源-->
<add key="ksRBAC_DataAccessLayer" value="SQLServerDAL"/>
类工厂代码如下:
namespace KoalaStudio.RBAC.ClassFactory
{
public sealed class DALFactory
{
//数据访问层的DLL文件路径
private static readonly string dalName = ConfigurationManager.AppSettings["ksRBAC_DALFile"].ToString();
///数据访问层的命名空间
private static readonly string path = "KoalaStudio.RBAC." + ConfigurationManager.AppSettings["ksRBAC_DataAccessLayer"].ToString();
/// <summary>
/// 分组类工厂
/// </summary>
/// <returns></returns>
public static IDAL.IGroupDAL CreateGroup()
{
string className = path + ".GroupDAL";
Assembly assm = Assembly.Load(dalName);
Type objType = assm.GetType(className, true);
return (IDAL.IGroupDAL)Activator.CreateInstance(objType);
}
/// <summary>
/// 操作类工厂
/// </summary>
/// <returns></returns>
public static IDAL.IOperationDAL CreateOperation()
{
string className = path + ".OperationDAL";
Assembly assm = Assembly.Load(dalName);
Type objType = assm.GetType(className, true);
return (IDAL.IOperationDAL)Activator.CreateInstance(objType);
}
}
}
{
public sealed class DALFactory
{
//数据访问层的DLL文件路径
private static readonly string dalName = ConfigurationManager.AppSettings["ksRBAC_DALFile"].ToString();
///数据访问层的命名空间
private static readonly string path = "KoalaStudio.RBAC." + ConfigurationManager.AppSettings["ksRBAC_DataAccessLayer"].ToString();
/// <summary>
/// 分组类工厂
/// </summary>
/// <returns></returns>
public static IDAL.IGroupDAL CreateGroup()
{
string className = path + ".GroupDAL";
Assembly assm = Assembly.Load(dalName);
Type objType = assm.GetType(className, true);
return (IDAL.IGroupDAL)Activator.CreateInstance(objType);
}
/// <summary>
/// 操作类工厂
/// </summary>
/// <returns></returns>
public static IDAL.IOperationDAL CreateOperation()
{
string className = path + ".OperationDAL";
Assembly assm = Assembly.Load(dalName);
Type objType = assm.GetType(className, true);
return (IDAL.IOperationDAL)Activator.CreateInstance(objType);
}
}
}
简单解释一下。
这里与项目内引用的主要区别就是增加了一行代码“Assembly assm = Assembly.Load(dalName)”。这行代码的作用,是指定了需要加载的类所在的程序集的名称,这个名称是在项目的“属性”-“应用程序”-“程序集名称”中手工设定的。这样,在后面实例化的过程中,就避免了因程序分不清反射对象的位置而造成执行错误。
为什么项目内反射不会出现这样的问题呢,其实项目内反射也应该加上这行代码制定具体程序集,但不加的话系统会默认反射的是本项目自己的程序集,所以缺少了这行代码也同运行通过。但是换了不同项目,却还是默认反射自己的程序集,自然就会出现这个问题了。
作者:行一山人
出处:http://www.cnblogs.com/benbenkoala/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。