`

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

阅读更多
原帖地址:http://www.cnblogs.com/f-ye/p/func.html

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 };
});

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

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


本文链接:http://www.cnblogs.com/f-ye/p/func.html,转载请注明。

分享到:
评论

相关推荐

    #include

    #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;assert.h&gt; #include &lt;string.h&gt; typedef struct matrix { int row; int col; } matrix; typedef struct minCost { int cost; int mid; } minCost; minCost** ...

    #include &lt;malloc.h&gt;

    #include &lt;stdio.h&gt; #include &lt;malloc.h&gt; struct DATA { int ID; char name[4]; char sex[3]; int score; }; void paixu(int*,DATA*,int); int sishewuru(double); void func1(int*,int*,DATA*,int*,int,...

    详解FuncT与ActionT区别

    Func&lt;Result&gt;,Func&lt;T1&gt;是一个.Net内置的泛型委托。 Func&lt;TResult&gt; Func&lt;T&gt; Func&lt;T1&gt; Func&lt;T1&gt; Func&lt;T1&gt; 它有5种形式,只是参数个数不同;第一个是无参数,但是有返回值; 下面是一个简单的普通委托来传方法的示例...

    c# 省市区集成模块【支持延迟加载异步回调】

    void ActivationEventBeginInvoke(Func&lt;int&gt; id,Action&lt;IEnumerable&lt;T&gt;&gt; TValue = null, Action&lt;IAsyncResult&gt; Ting=null); IEnumerable&lt;T&gt; GetChildList(); void GetChildList(Action&lt;IEnumerable&lt;T&gt;&gt; TValue)...

    C#编程-提高篇

    这个方法可以从Func&lt;T1 , T2 , TResult&gt;委托中引用,其中T1 和T2 的类型相同:Func&lt;T , T , bool&gt;。 给Sort&lt;T&gt;方法指定下述签名: public static void Sort&lt;T&gt;(IList&lt;T&gt; sortArray, Func&lt;T, T, bool&gt; comparsion...

    net Lamada表达式转匿名对象

    将Expression&lt;Func&lt;T&gt;&gt;表达式转为Expression&lt;Func&lt;T, object&gt;&gt;

    Discuz! 5.0 patch 20060911

    version.php&lt;br/&gt;\my.php&lt;br/&gt;\pm.php&lt;br/&gt;\search.php&lt;br/&gt;\stats.php&lt;br/&gt;\...func.php&lt;br/&gt;\include\common.inc.php&lt;br/&gt;\include\common.js&lt;br/&gt;\include\discuzcode.func.php&lt;br/&gt;\include\editor.func.php&lt;br/&gt;\...

    Expression表达式转换为SQL语句,支持SqlServer、MySql、Oracle、Sqlite、PostgreSql

    .NET Standard 2.1、.NET 5、.NET 6、.NET 7 版本SQLBuilder,Expression表达式转换为SQL语句,支持SqlServer、MySql、Oracle、Sqlite、PostgreSql;基于Dapper实现了不同数据库对应的数据仓储Repository;

    反射在ef中的应用.pdf

    #region 3.2 根据指定条件 修改 +int ModifyBy(Expression&lt;Func&lt;T, bool&gt;&gt; whereLambda) /// &lt;summary&gt; /// 2.3 根据指定条件 修改 /// &lt;/summary&gt; /// &lt;param name="whereLambda"&gt;条件表达式&lt;/param&gt; /// ...

    Discuz!5.0 GBK补丁包

    &lt;br/&gt;&lt;br/&gt;\admin 目录&lt;br/&gt;\admin\database.inc.php&lt;br/&gt;\admin\forums....func.php&lt;br/&gt;\include\category.inc.php&lt;br/&gt;\include\common.inc.php&lt;br/&gt;\include\cron.func.php&lt;br/&gt;\include\discuzcode.func.php&lt;br/&gt;\...

    docopt.go:命令行参数解析器,它将使您微笑

    naval_fate ship &lt;name&gt; move &lt;x&gt; &lt;y&gt; [--speed=&lt;kn&gt;] naval_fate ship shoot &lt;x&gt; &lt;y&gt; naval_fate mine (set|remove) &lt;x&gt; &lt;y&gt; [--moored|--drifting] naval_fate -h | --help naval_fate --version Options: -...

    NCURSES-Programming 文档示例程序

    |----&gt; init_func_example.c -- 初始化函数示例 |----&gt; key_code.c -- 显示键盘字符代码的程序 |----&gt; mouse_menu.c -- 一个可以使用鼠标访问的菜单 |----&gt; other_border.c -- 展示与box()函数不同的显示边框的...

    ROS压缩图像订阅、还原例程

    --&lt;include file="$(find darknet_ros)/launch/yolo_v4.launch" /&gt;--&gt; &lt;node name="img_test" pkg="img_test" type="target_ROI" output="screen"&gt; &lt;!--功能选择,,value=0 发布compress还原后的图像,value=1制作...

    万年历的代码

    &lt;div class='top_bar_text' id='365riliUserName'&gt;&lt;/div&gt; &lt;div class='top_bar_text' id='bd_login'&gt;登录&lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div id='cal_down'&gt; &lt;div id='cal_downleft'&gt; &lt;div id='mainCal'&gt;&lt;/...

    node-soap-cli

    node-soap-cli SOAP端点的命令行客户端 ... " GetQuoteResult " : " &lt;StockQuotes&gt;&lt;Stock&gt;&lt;Symbol&gt;GOOG&lt;/Symbol&gt;&lt;Last&gt;595.50&lt;/Last&gt;&lt;Date&gt;9/29/2015&lt;/Date&gt;&lt;Time&gt;9:36am&lt;/Time&gt;&lt;Change&gt;+0.61&lt;/Change&gt;&lt;Open&gt;597

    成员函数用于回调函数

    如qsort 等函数需要函数指针才能回调 用此函数库可以将成员函数指针转为普通函数指针 ... *static_cast&lt;const T*&gt;(a)-*static_cast&lt;const T*&gt;(b) : *static_cast&lt;const T*&gt;(b)-*static_cast&lt;const T*&gt;(a); }

    VC++2010 DLL导出函数、类、对话框类(VS2010框架)

    本例子建立2个VC++2010的DLL工程。包含了可以导出的函数、一般C++类和含有对话框资源的类。 各导出代码部分相互独立。 有word文档说明。说明列出了与DLL导出有关的部分,并在例程中以诸如“// DLL_Func_01-----...…… ...

    【JavaScript源代码】Vue3中ref与toRef的区别浅析.docx

     ref就是复制 复制是不会影响原始数据的 &lt;template&gt; &lt;div&gt; &lt;div&gt; &lt;div&gt;{{stateObj}}&lt;/div&gt; &lt;button @click="func1"&gt;按钮&lt;/button&gt; &lt;/div&gt; &lt;/div&gt; &lt;/template&gt; &lt;script&gt; import {ref} from 'vue' export ...

    经典C/C++面试题目大汇总(全附答案).doc

    求下面函数的返回值(微软)&lt;br&gt;int func(x) &lt;br&gt;{ &lt;br&gt; int countx = 0; &lt;br&gt; while(x) &lt;br&gt; { &lt;br&gt; countx ++; &lt;br&gt; x = x&(x-1); &lt;br&gt; } &lt;br&gt; return countx; &lt;br&gt;} &lt;br&gt;假定x = 9999。 答案:8&lt;br&gt;思路:将x转化...

Global site tag (gtag.js) - Google Analytics