C#将Lambdaexpression式作为方法parameter passing

我有一个lambdaexpression式,我希望能够传递和重用。 代码如下:

public List<IJob> getJobs(/* i want to pass the lambda expr in here */) { using (SqlConnection connection = new SqlConnection(getConnectionString())) { connection.Open(); return connection.Query<FullTimeJob, Student, FullTimeJob>(sql, (job, student) => { job.Student = student; job.StudentId = student.Id; return job; }, splitOn: "user_id", param: parameters).ToList<IJob>(); } 

这里的关键是我想能够将我在这里使用的lambdaexpression式传递给调用此代码的方法,所以我可以重用它。 lambdaexpression式是我的.Query方法中的第二个参数。 我假设我想要使用一个操作或function,但我不太清楚这是什么语法或如何工作。 有人可以给我一个例子吗?

使用Func<T1, T2, TResult>委托作为参数types并将其传递给您的Query

 public List<IJob> getJobs(Func<FullTimeJob, Student, FullTimeJob> lambda) { using (SqlConnection connection = new SqlConnection(getConnectionString())) { connection.Open(); return connection.Query<FullTimeJob, Student, FullTimeJob>(sql, lambda, splitOn: "user_id", param: parameters).ToList<IJob>(); } } 

你可以这样称呼它:

 getJobs((job, student) => { job.Student = student; job.StudentId = student.Id; return job; }); 

或者把lambda赋给一个variables并传入。

如果我明白你需要下面的代码。 (通过parameter passingexpression式lambda)方法

 public static void Method(Expression<Func<int, bool>> predicate) { int[] number={1,2,3,4,5,6,7,8,9,10}; var newList = from x in number .Where(predicate.Compile()) //here compile your clausuly select x; newList.ToList();//return a new list } 

调用方法

 Method(v => v.Equals(1)); 

你可以在class上做同样的事情,看这个例子。

 public string Name {get;set;} public static List<Class> GetList(Expression<Func<Class, bool>> predicate) { List<Class> c = new List<Class>(); c.Add(new Class("name1")); c.Add(new Class("name2")); var f = from g in c. Where (predicate.Compile()) select g; f.ToList(); return f; } 

调用方法

 Class.GetList(c=>c.Name=="yourname"); 

我希望这是有用的

Lambdaexpression式有一个Action<parameters>types(如果它们没有返回值)或者Func<parameters,return> (如果它们有返回值的话)。 在你的情况下,你有两个input参数,你需要返回一个值,所以你应该使用:

 Func<FullTimeJob, Student, FullTimeJob> 

您应该使用委托types并将其指定为您的命令参数。 您可以使用内置委托types之一 – ActionFunc

在你的情况,它看起来像你的委托需要两个参数,并返回一个结果,所以你可以使用Func

 List<IJob> GetJobs(Func<FullTimeJob, Student, FullTimeJob> projection) 

然后,您可以调用传递给委托实例的GetJobs方法。 这可能是匹配该签名,匿名委托或lambdaexpression式的方法。

PS你应该使用方法名称的PascalCase – GetJobs ,而不是getJobs