2012年2月14日

 

最近在弄一些反射相关的东西,遇到了一些反射和泛型结合带来的问题,今天把最近与到的问题整理一下,分享给大家。

常见的定义泛型的类有两种,我们称之为

    开放式构造类型 (open constructed type)

    封闭式构造类型(closeed constructed type)

此文中,我们分别定义两个泛型类如下:

View Code
    public class ClassT<T,TR,TV>
{
public T Test()
{
return default(T);
}

public T Print(T t)
{
Console.WriteLine("ClassT"+t);
return t;
}

public T Print(T t, TR tr)
{
Console.WriteLine("ClassT" + t);
return t;
}

public T Print(T t, TV tv)
{
Console.WriteLine("ClassT" + t);
return t;
}


}

public class DerivedClassT: ClassT<string,string,int>
{

}

 

封闭是的构造类型和普通类型的反射过程基本一致,这里不重点介绍了,下面我们主要介绍开放式构造类型的反射:

1. 如何反射创建泛型类对象?一共四步:

  1).获得对象的Type

    对于泛型类,必须要确认获得的Type是否是指定了参数类型的,如:    

     Type type1 = typeof(ClassT<,,>);//ContainsGenericParameters==true
     Type type2 = typeof(ClassT<string, string, int>);//ContainsGenericParameters==false
     Type type3 = assembly.GetType("Testdll.ClassT`3");//ContainsGenericParameters==true
   Type type4 = instance.GetType();//ContainsGenericParameters==false 

  2).如果是开放式的构造类型,为泛型类Type指定类型,由于ClassT的构造方法不包含任何参数,因此ctorInfo的ContainsGenericParameters为false,但是如果需要创建一个对象,必须保证type的ContainsGenericParameters也为false,否则需要为泛型类指定类型。

if (type1.ContainsGenericParameters)
{
    type1 = type1.MakeGenericType(typeof (string), typeof (string), typeof (int));//为泛型类指定类型
}

  2).获得指定类型之后的Type的ConstructorInfo

ConstructorInfo ctorInfo=type1.GetConstructor(new Type[0]);

  4).Invoke  

ctorInfo.Invoke(new object[0]);      
posted @ 2012-02-14 20:45 独上高楼 阅读(193) 评论(0) 编辑

2012年2月8日

在使用Drop Database 命令的时候,经常会由于数据库正在被占用而删除失败:Cannot drop database "×××" because it is currently in use.

按照正常的解决思路可能会去查询访问这个数据库的连接,然后分别去关闭每一个连接。其实没有必要那么麻烦

最简单的方法是用single user去删除。

执行脚本如下:

USE [master]
GO
ALTER DATABASE [ContentDatabase_3000] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
USE [master]
GO
DROP DATABASE [ContentDatabase_3000]
GO

posted @ 2012-02-08 14:45 独上高楼 阅读(94) 评论(0) 编辑