日期:2014-05-17  浏览次数:20827 次

为什么反射执行同一般执行的结果不一样?
学习反射,写一个SqlHelper类,只有2个方法。
	public class SqlHelper
{
private OleDbConnection cn;
public SqlHelper()
{
cn = new OleDbConnection(ConfigurationManager.ConnectionStrings["OleDbConnectionString"].ConnectionString);
cn.Open();
}
public void Close()
{
cn.Close();
}
}

编译成SqlHelper.dll,放在f:下。
在aspx.cs中写:
		Assembly assembly = Assembly.LoadFrom(@"f:\SqlHelper.dll");
Type type = assembly.GetType("SqlHelper");
object obj = assembly.CreateInstance(type.FullName);
type.GetConstructor(Type.EmptyTypes).Invoke(obj, null);
type.GetMethod("Close").Invoke(obj, null);

现象:执行完毕后,发现Access数据库文件旁多出.ldb文件,且删不掉,说明数据连接没有关闭。
如果不用反射,就一般执行:
SqlHelper sqlHelper = new SqlHelper();
sqlHelper.Close();
则没有上述现象,数据连接总是关闭的。请解释为什么发生这种现象,明明最后执行了Close方法,数据连接却没有关闭?

------解决方案--------------------
Assembly assembly = Assembly.LoadFrom(@"f:\SqlHelper.dll");
Type type = assembly.GetType("SqlHelper");
object obj = assembly.CreateInstance(type.FullName);
type.GetConstructor(Type.EmptyTypes).Invoke(obj, null);
type.GetMethod("Close").Invoke(obj, null);


第一:
object obj = assembly.CreateInstance(type.FullName);
已经执行一次 Open
第二:
type.GetConstructor(Type.EmptyTypes).Invoke(obj, null);
执行第二次 Open

通俗的说。你只需要改成一下代码:
Assembly assembly = Assembly.LoadFrom(@"f:\SqlHelper.dll");
Type type = assembly.GetType("SqlHelper");
object obj = assembly.CreateInstance(type.FullName);
//type.GetConstructor(Type.EmptyTypes).Invoke(obj, null);
type.GetMethod("Close").Invoke(obj, null);