Func<T,TResult> 委托
Func<T,TResult> 委托
https://docs.microsoft.com/zh-cn/dotnet/api/system.func-2?redirectedfrom=MSDN&view=net-5.0
下问来自:https://www.cnblogs.com/longyi/p/3541964.html?utm_source=tuicool&utm_medium=referral
比如
interface IRepository<T> where T:class { IEnumerable<T> FindAll(Func<T, bool> exp); }
我现在要调用FindAll方法,要怎么用?
Func<T, bool> exp
1、Func是一个匿名委托(形参exp的类型)
T是Func这个委托中的传入参数,即接口IRepository<T>的类型参数,由于带有约束where T:class, 所以T只能是类,而不能是结构等其他类型
bool代表Func的返回参数类型为bool
2、exp是方法的形参,Func委托类型的实例
3、IEnumerable<T>是方法的返回类型
用的时候可以这样
List<string> list = new List<string>();
这里只是举一个例子,实际中,只要是实现了IRepository<T>这个接口的类实例都可以这么用
list.FindAll(new Func<string, bool>(delegate(string str){ return str.Length > 0; }));
list.FindAll(delegate(string str) { return str.Length > 0; });
list.FindAll(new Func<string, bool>(str => {return str.Length > 0;}));
list.FindAll(new Func<string, bool>(str => str.Length > 0));
写法都是等效的,编译以后FindAll()里面的部分都是一个委托类型的实例
最后一个直接简化成一个Lambda表达式了
整个方法的返回类型为IEnumerable<string>
List<string> list = new List<string>();
list.FindAll(new Func<string, bool>(delegate(string str){ return str.Length > 0; }));
list.FindAll(delegate(string str) { return str.Length > 0; });
list.FindAll(str => {return str.Length > 0;});
list.FindAll(str => str.Length > 0);