`

使用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,转载请注明。

分享到:
评论

相关推荐

    深入理解C#中常见的委托

    3. `Func&lt;T1, T2, TResult&gt;` 包含两个输入参数 `T1` 和 `T2`,返回类型为 `TResult`。 4. `Func&lt;T1, T2, T3, TResult&gt;` 有三个输入参数 `T1`, `T2`, `T3`,返回类型为 `TResult`。 5. `Func&lt;T1, T2, T3, T4, TResult...

    C#中Action和Func的区别

    `Func&lt;T1, T2, ..., TN, TResult&gt;` 是一个泛型委托类型,它允许你封装一个接受N个参数并返回一个TResult类型结果的方法。这里的T1, T2, ..., TN是参数类型,TResult是返回值类型。例如,如果你有一个接受一个整数...

    C# 窗体间传值.docx

    如果方法有参数并返回值,可以使用`Func&lt;T, TResult&gt;`、`Func&lt;T1, T2, TResult&gt;`等,如: ```csharp Func&lt;string, string&gt; RetBook = new Func&lt;string, string&gt;(FuncBook); Console.WriteLine(RetBook("aaa")); ...

    使用Func调用异步方法的Helper类泛型

    例如,`Func&lt;T1, T2, TResult&gt;`表示一个接受两个T1和T2类型参数并返回TResult类型结果的函数。在我们的上下文中,我们可以定义一个Func委托来封装异步方法,该方法接受任何参数并返回一个Task,这正是异步操作的结果...

    深入c# Func委托的详解

    public delegate TResult Func&lt;in T1, in T2, ..., in TN, out TResult&gt;(T1 arg1, T2 arg2, ..., TN argN); ``` 这里的`T1, T2, ..., TN`是输入参数类型,而`TResult`是返回类型。`Func`委托有多个重载版本,从零个...

    Action,Func的Demo

    此外,`Action`和`Func`还有重载版本,从`Action`到`Action&lt;T1, T2,...,TN&gt;`,以及从`Func&lt;T1, T2,...,TN, TResult&gt;`到`Func&lt;TResult&gt;`,涵盖了不同参数数量和返回值的需求。 在"TestAction"这个示例项目中,我们...

    委托例子:自定义委托,泛型委托,多播委托,

    `Func&lt;T1, T2, TResult&gt;`和`Action&lt;T1, T2&gt;`等预定义的泛型委托就是很好的例子。我们可以创建自己的泛型委托,如`MyGenericDelegate&lt;T, U, V&gt;`: ```csharp public delegate V MyGenericDelegate&lt;T, U, V&gt;(T arg1, ...

    C#知识要点

    例如,Func&lt;T&gt;表示一个不带参数但返回一个值的方法,而Func&lt;T1, T2, TResult&gt;则表示一个接受两个参数并返回一个值的方法。 委托是支持事件驱动编程的基础。在C#中,事件是一种特殊的委托,它表示一个动作或一组动作...

    C#委托 C#委托 C#委托

    例如,`Action&lt;T1, T2&gt;`表示无返回值但接受两个参数的方法,`Func&lt;T1, T2, TResult&gt;`则表示接受两个参数并返回`TResult`类型值的方法。 总结,C#委托是一种强大的工具,它使得代码更加灵活和可扩展。通过理解委托的...

    c# 委托的常见用法

    - `Func&lt;TResult&gt;`: 有返回值的委托,如`Func&lt;int&gt;`表示返回整型结果的方法,`Func&lt;T, TResult&gt;`表示接受一个T类型参数并返回TResult类型结果的方法。 这些预定义的泛型委托在日常编码中非常常见,可以方便地用于...

    c#中的泛型委托详解

    除了 `Action&lt;T&gt;`,还有 `Func&lt;T&gt;` 系列,如 `Func&lt;T, TResult&gt;`,它接受一个参数并返回 `TResult` 类型的结果。例如: ```csharp public static Func&lt;int, string&gt; GetNumberToString = (i) =&gt; i.ToString(); ``` ...

    delegate.zip

    自C# 2.0起,可以创建泛型委托,如`Func&lt;T, TResult&gt;`和`Action&lt;T1, T2,...&gt;`。这些预定义的委托类型简化了代码,并提供了类型安全。 10. **委托的内存管理**: 由于委托实例可以持有对方法的引用,因此可能导致...

    C#泛型详解由入门到精通.docx

    - 如`Func&lt;T, TResult&gt;`和`Action&lt;T&gt;`是预定义的泛型委托,分别表示返回值类型和无返回值类型。 10. **泛型代码中的默认关键字** - `default(T)`关键字用于获取类型参数`T`的默认值,对于值类型是零,对于引用...

    使用Lambda表达式查找指定字符

    在C#中,Lambda表达式还可以与委托类型关联,如`Func&lt;T1, T2, TResult&gt;`和`Action&lt;T1, T2&gt;`等,这些委托类型代表了参数类型和返回值类型。Lambda表达式可以自动转换为相应的委托类型,使得它们可以直接用于方法调用...

    C#委托学习

    Action&lt;int, int&gt; test2 = (x, y) =&gt; { Console.WriteLine("void method(t1, t2)"); }; test1(); test2(2, 3); Func&lt;int&gt; test4 = () =&gt; 10; Func&lt;int, int, int&gt; test5 = (x, y) =&gt; x * y; ``` 使用泛型委托可以...

    C# 的函数编程详解

    而泛型委托类型如`Func&lt;T1, T2, Tresult&gt;`则提供了一种更灵活的方式来表示不同参数和返回类型的函数。 2. **函数类型** 委托类型如`MyFunction`是C#中函数类型的表示,可以存储与之匹配的方法引用。使用`Func...

    深入了解c# 匿名类型

    它们可以接受多个参数类型,如`Func&lt;T1, T2, TResult&gt;`和`Action&lt;T1, T2&gt;`。 - `Func&lt;TResult&gt;`:返回类型为`TResult`,可以有零个或多个输入参数。 - `Action&lt;T&gt;`:没有返回值,可以有零个或多个输入参数。 在...

    C#利用delegate实现Javascript的each方法

    - `Func&lt;T1, T2, ..., TResult&gt;`:这是一个返回值为`TResult`的委托,可以有多个输入参数(`T1, T2, ...`)。 - `Action&lt;T1, T2, ..., TN&gt;`:这是一个返回值为`void`的委托,同样可以有多个输入参数(`T1, T2, ..., ...

    C#泛型委托的用法实例分析

    委托类型如`Action`、`Func`等都是预定义的,而`Func&lt;T1, T2, TResult&gt;`则是其中的一个,它表示接受两个参数并返回一个`TResult`类型的结果。 现在,我们结合这两个概念,探讨泛型委托。在上述的`BubbleSorter`类中...

Global site tag (gtag.js) - Google Analytics