C# передать лямбда-выражение в качестве параметра метода
У меня есть лямбда-выражение, которое я хотел бы иметь возможность передавать и повторно использовать. Вот код:
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>();
}
ключ здесь, я хочу быть в состоянии передать лямбда-выражение, которое я использую здесь в метод, который вызывает этот код, поэтому я могу использовать его. Лямбда-выражение является вторым аргументом внутри моего .Метод запроса. Я предполагаю, что я хотел бы использовать действие или функцию, но я не совсем уверен, что синтаксис для этого или как это работает. Может кто-нибудь пожалуйста дать мне пример?
4 ответов:
использовать
Func<T1, T2, TResult>делегировать в качестве типа параметра и передать его в ваш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; });или присвоить лямбда-выражение на переменную и передать это in.
если я понимаю, вам нужен следующий код. (передача выражения лямбда по параметру) Метод
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));вы можете сделать то же самое в своем классе, см. Это пример.
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");Я надеюсь, что это полезно
лямбда-выражения имеют тип
Action<parameters>(если они не возвращают значение) илиFunc<parameters,return>(в случае, если они имеют возвращаемое значение). В вашем случае у вас есть два входных параметра, и вам нужно вернуть значение, поэтому вы должны использовать:Func<FullTimeJob, Student, FullTimeJob>
вы должны использовать тип делегата и указать его в качестве параметра команды. Вы можете использовать один из встроенных типов делегата -
ActionиFunc.в вашем случае, похоже, что ваш делегат принимает два параметра и возвращает результат, поэтому вы можете использовать
Func:List<IJob> GetJobs(Func<FullTimeJob, Student, FullTimeJob> projection)вы могли бы тогда назвать свой
GetJobsпередача метода в экземпляре делегата. Это может быть метод, который соответствует этой подписи, анонимный делегат или лямбда выражение.P. S. Вы должны использовать PascalCase для названия метода -
GetJobs, а неgetJobs.
Comments