使用Func<T1, T2, TResult> 委托返回匿名对象

 

Func<T1, T2, TResult> 委托

封装一个具有两个参数并返回 TResult 参数指定的类型值的方法。

语法

public delegate TResult Func<in T1, in T2, out TResult>(
T1 arg1,
T2 arg2
)
in T1
此委托封装的方法的第一个参数类型。
 
该类型参数是逆变。即可以使用指定的类型或派生程度更低的类型。有关协变和逆变的更多信息,请参见泛型中的协变和逆变。
in T2
此委托封装的方法的第二个参数类型。
out TResult
此委托封装的方法的返回值类型。
 
该类型参数是协变。即可以使用指定的类型或派生程度更高的类型。有关协变和逆变的更多信息,请参见泛型中的协变和逆变。
 
参数
arg1类型:T1
此委托封装的方法的第一个参数。
arg2类型:T2
此委托封装的方法的第二个参数。
 
返回值
类型:TResult
此委托封装的方法的返回值。

备注

可以使用此委托表示一种能以参数形式传递的方法,而不用显式声明自定义委托。封装的方法必须与此委托定义的方法签名相对应。也就是说,封装的方法必须具有两个均通过值传递给它的参数,并且必须返回值。

若要引用具有两个参数并返回 void 的方法(或者要在 Visual Basic 中引用被声明为 Sub 而不是被声明为 Function 的方法),请改用泛型 Action<T1, T2> 委托。

  在使用 Func<T1, T2, TResult> 委托时,不必显式定义一个封装具有两个参数的方法的委托。例如,以下代码显式声明了一个名为 ExtractMethod 的委托,并将对 ExtractWords 方法的引用分配给其委托实例。

示例

下面的示例演示如何声明和使用 Func<T1, T2, TResult> 委托。此示例声明一个 Func<T1, T2, TResult> 变量,并将其分配给一个采用 String 值和 Int32 值作为参数的 lambda 表达式。如果 String 参数的长度等于 Int32 参数的值,则此 lambda 表达式将返回 true。随后在查询中使用封装此方法的委托来筛选字符串数组中的字符串。

 示例

using System;
using System.Collections.Generic;
using System.Linq; public class Func3Example
{
public static void Main()
{
Func<String, int, bool> predicate = (str, index) => str.Length == index; String[] words = { "orange", "apple", "Article", "elephant", "star", "and" };
IEnumerable<String> aWords = words.Where(predicate).Select(str => str); foreach (String word in aWords)
Console.WriteLine(word);
}
}

了解完这些以后,我们来看看它的应用。
      不知道童鞋们有没有遇到这样的问题,在读取数据访问层中数据集合时,发现该方法需要返回的结果中包括对象及其外键对象时,又不想添加一个实体类来封装它,那么有什么别的好办法吗?也许您会选择用动态对象(dynamic关键字),不错,这个这确实可以解决这个问题,但是有一个弊端,且不论动态对象在运行时编译,在编写程序时,它存在一个很不方便的体验,它不能点(.)出它的属性,不免产生意外的拼写错误或是寻找-复制-黏贴的麻烦。

那么怎么办呢?我们可以利用Func<T1, T2, TResult> 委托来帮助我们实现。

 数据访问层

public IEnumerable<TResult> GetAllUser<TResult>(Func<User, Person, TResult> itemFactory)
{
var results = from u in User
join p in Person on u.Id equals p.uId
select new { User = u, Person = p }; IList<TResult> resultItems = new List<TResult>();
foreach (var item in results.ToList())
{
resultItems.Add(itemFactory(item.User, item.Person));
} return resultItems;
}
 表示层调取

var query = userDao.GetAllUser((u, p) =>
{
return new { u.Id, u.LoginName, pId = p.Id, p.Name };
});

此外,当然也可以自定义更多的委托,这里笔者就不详细介绍了,读者可自行尝试。

哈哈,这样是否有帮到您呢?本人文笔粗糙简陋,请多多大虾们指教!

 
 
 

最新文章

  1. 使用SignalR实现服务端消息推送
  2. unity自带寻路Navmesh入门教程(三)
  3. [Linux] -Docker修改空间大小
  4. 教新手一步步解决:Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRIDE environment variable to和更新gradle问题
  5. linux tcp协议重传定时器
  6. MySQL性能优化的最佳经验
  7. 《黑客大曝光》实践部分——sql注入(7/8)
  8. ASP.NET MVC3 实例(六) 增加、修改和删除操作(二)
  9. CCTableView的使用和注意事项
  10. 尝试设计LFSR加密器,并用CAP4验证随机性
  11. MAC OSX使用篇
  12. 开发使用混合式Winform模块
  13. Logstash利用GeoIP库显示地图以及通过useragent显示浏览器(四)
  14. sublime 配置 python IDE
  15. windows server 2012 AD 活动目录部署系列(七)Active Directory 的授权还原
  16. 列表ListBox、ListView、GridView 排序
  17. 今天开始学习php,粘一些重点放这以便查看记忆。
  18. .net like模糊查询参数化
  19. Spring JDBC查询数据
  20. c++多态性详解(转)

热门文章

  1. ubuntu12.04管理员账户登录不了桌面,仅仅能客人会话登录
  2. MonkeyRunner源码分析之-谁动了我的截图?
  3. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)
  4. Floodlight controller 线程池模型
  5. Windows Azure VM两shut down 道路
  6. outlook 会议室
  7. 增加 Java 有几个好习惯表现
  8. MVC 用扩展方法执行自定义视图,替代 UIHint
  9. 我的Android 4 学习系列
  10. QTP使用技巧