C#如何把List of Object转换成List of T具体类型
上周码程序的时候碰到个问题,因为设计上的约束,一个方法接受的参数只能为List<object>类型,然而该方法需要处理的真实数据则是确定的List<Currency>。然而C#不允许显示的直接转换类型,并且两个方向上都不可以操作。这个问题让我爆了一会儿,最后在MSDN上找到了一个OfType<T>的拓展方法可以完成这件事。
Enumerable.OfType<TResult> 方法:
此方法通过使用延迟执行实现。 即时返回值为一个对象,该对象存储执行操作所需的所有信息。 只有通过直接调用对象的 GetEnumerator 方法或使用 Visual C# 中的 foreach(或 Visual Basic 中的 For Each)来枚举该对象时,才执行此方法表示的查询。
OfType<TResult>(IEnumerable) 方法仅返回 source 中那些可以转换为 TResult 类型的元素。 如果元素不能转换为 TResult 类型,但却不想接收异常,则使用 Cast<TResult>(IEnumerable)。
此方法是少数标准查询运算符方法之一,标准查询运算符方法可应用于含有非参数化类型(如 ArrayList)的集合。 这是因为 OfType<TResult> 扩展了类型 IEnumerable。 OfType<TResult> 不仅无法应用于基于参数化的 IEnumerable<T> 类型的集合,也无法应用于基于非参数化的 IEnumerable 类型的集合。
通过将 OfType<TResult> 应用于实现 IEnumerable 的集合,可以获得使用标准查询运算符查询集合的能力。 例如,将 Object 的类型参数指定为 OfType<TResult> 将返回一个对象,其类型为 C# 中的 IEnumerable<Object> 或 IEnumerable(Of Object) 中的 Visual Basic,标准查询运算符可应用于该对象。
来看个直观的例子:
static void Main(string[] args)
{
List<object> currencyList = new List<object>()
{
new Currency(){Id = Guid.NewGuid(), Name = "a"},
new Currency(){Id = Guid.NewGuid(), Name = "b"},
new Currency(){Id = Guid.NewGuid(), Name = "c"}
}; List<object> currencyList1 = new List<object>()
{
"a", "b", "c"
}; List<Currency> currencies = currencyList.OfType<Currency>().ToList();
List<Currency> currencies1 = currencyList1.OfType<Currency>().ToList(); Console.WriteLine("currencies list:");
foreach (var item in currencies)
{
Console.WriteLine(item.Id);
} Console.WriteLine("currencies1 list:");
foreach (var item in currencies1)
{
Console.WriteLine(item.Id);
}
}
这段代码中,currencies中是合法的Currency对象,所以可以被转换。而currencies1中是string对象,不是Currency,所以不能被转换,也不会抛异常。最后currencies1的结果是个空的List,而不是null。这段代码的输出结果如下:
C#如何把List of Object转换成List of T具体类型的更多相关文章
- 用于把List<Object>转换成Map<String,Object>形式
/** * 用于把List<Object>转换成Map<String,Object>形式,便于存入缓存 * @author zhang_bo * @param keyName ...
- java Object转换成指定的类型
java Object转换成指定的类型 /** * Object转成指定的类型 * @param obj * @param type * @param <T> * @return */ p ...
- DataTable转换成匿名类的List类型
DataTable转换成匿名类的List类型 因为匿名类是不能够 Activator.CreateInstance进行反射实例化的 /// <summary> /// 匿名类的转换方式 ...
- 将Object转换成Dictionary方法
如果Object是Dictionary类型,直接返回 如果Object是NameValueCollection类型,则添加到Dictionary里 如果Object是Hashtable类型,添加到Di ...
- 将[object Object]转换成json对象
这两天在做中英文双版的文件,页面根据语言读取不同的内容.js模板用的是ejs json文件: "components":{ "pages":{ "ho ...
- 将object转换成dyamic类型 解决long输出到浏览器过长精度丢失问题
需求: 数据库使用飘雪算法保存唯一标识 是一个18位长整形 将数据输出到浏览器时出现了精度丢失问题,这是一个重大的BUG.如果没解决好整个项目都要改一遍. 讨论有三个办法 1.把所有实体 数据模型的 ...
- java中Object转换成int或String类型方法
转载: http://www.cnblogs.com/1020182600HENG/p/6137206.html Object obj = getObject(); if(obj instanceof ...
- 如何优雅的将Object转换成List
Main主函数中的 Object obj模拟了List对象.后续的代码首先判断obj是否是List类型,然后使用Class.cast做类型转换. 如果你想使用更方便的方法,可以直接调用下面的函数. p ...
- Map中object转换成boolean类型
Ajax请求查询数据之后,返回的是map类型, resultMap.put("flag", flag); 在接收到数据之后判断时,转换出现异常,导致页面点击按钮之后,页面没有反应, ...
随机推荐
- Java Decompiler 反编译工具下载地址及JD-Eclipse设置菜单翻译
官网地址:http://jd.benow.ca/ JD-GUI:jd-gui-0.3.6.windows.zip JD-Eclipse:jd-eclipse-site-1.0.0-RC2.zip 菜单 ...
- maven2-snapshot快照库和release发布库的应用
在项目中应用snapshot和release库,应用snapshot和release库达到不同环境下发布不同的版本的目的,首先看一个pom文件的定义: <project> <mode ...
- Java算法-冒泡排序
冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成.这个算法的名字 ...
- 7 static关键字
class Person { static int i; static void fun() { System.out.println("我是静态函数"); } } 在静态函数中不 ...
- Web 安全:隐藏服务版本号
前述 为了防止一些恶意用户对 apache.nginx.php 等显示出来的版本信息进行攻击,生产环境需要关闭 web 服务的版本信息: apache 隐藏版本号 修改 httpd.conf,添加如下 ...
- htm.dropdownlist
@Html.DropDownList("status", new SelectList(new[] { "驳回", "确认", " ...
- iOS事件传递&响应者链条
原文:http://www.cnblogs.com/Quains/p/3369132.html 主要是记录下iOS的界面触摸事件处理机制,然后用一个实例来说明下应用场景. 一.处理机制 界面响应消息机 ...
- xml序列化方式
public static class MySerializeXmlHelper { static MySerializeXmlHelper() { } private static object _ ...
- [bzoj4551][Tjoi2016][Heoi2016]树
Description 在2016年,佳媛姐姐刚刚学习了树,非常开心. 现在她想解决这样一个问题:给定一颗有根树(根为1),有以下两种操作: 1. 标记操作:对某个结点打上标记(在最开始,只有结点1有 ...
- css3的@media媒体查询
css3新功能,根据屏幕大小进行识别. 参考: http://www.runoob.com/cssref/css3-pr-mediaquery.html