通过object类型实现C#泛型与具体类型的类型转换

泛型能够通过抽象以简单同类型的操作。在进行泛型操作的时候,数据类型转换也是常见的一种基本操作。泛型可以直接进行数据转换,如:

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();
}
发布了326 篇原创文章 · 获赞 94 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/weixin_43145361/article/details/104019926
今日推荐