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之一 – Action
和Func
。
在你的情况,它看起来像你的委托需要两个参数,并返回一个结果,所以你可以使用Func
:
List<IJob> GetJobs(Func<FullTimeJob, Student, FullTimeJob> projection)
然后,您可以调用传递给委托实例的GetJobs
方法。 这可能是匹配该签名,匿名委托或lambdaexpression式的方法。
PS你应该使用方法名称的PascalCase – GetJobs
,而不是getJobs
。