泛型能够通过抽象以简单同类型的操作。在进行泛型操作的时候,数据类型转换也是常见的一种基本操作。泛型可以直接进行数据转换,如:
int a = 0;
object o = a;
T t = (T) o;
但是注意,在做数据转换的时候,如果对象是某个具体数据格式,则无法使用 (T)o
的形式直接进行数据转换。比如,在某项目中,有个 CADEntityCollection
类,它是一个 CADEntity
的集合,那么以下代码就会报 无法将数据类型 CADEntity转换为 T
的错误,从而使编译失败。
List<T> list = new List<T>();
foreach(var item in CADEntityCollection entities.ToList())
if(item.GetType() == typeof(T))
list.Add((T)item);
对此,解决的办法其实只要再多一次转换,可以先将对象转换为 object
,然后再进行泛型转换,即 (T)(object)e
。以下是一个使用泛型编写的编写,通过两次转换,实现将泛型与具体类型的转换。
/// <summary>
/// 返回输入集合中的指定类型的所有对象,返回结果为 List<T> 类型。
/// </summary>
/// <typeparam name="T">指定的数据类型。</typeparam>
/// <param name="entities">输入的数据集合。</param>
/// <returns></returns>
public static List<T> GetItems<T>(CADEntityCollection entities)
{
return entities == null ? new List<T>() :
entities.Where(e => e.GetType() == typeof(T)).Select(e => (T)(object)e).ToList();
}