Вывод С# Pass Lambda в качестве параметра метода
У меня есть лямбда-выражение, которое я хотел бы пройти и повторно использовать. Здесь код:
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>();
}
Ключ здесь, я хочу, чтобы иметь возможность передать выражение лямбда, которое я использую здесь, в метод, вызывающий этот код, поэтому я могу его повторно использовать. Ячейное выражение является вторым аргументом внутри моего метода .Query. Я предполагаю, что хочу использовать Action или Func, но я не совсем уверен, что такое синтаксис для этого и как он работает. Может кто-нибудь, пожалуйста, дайте мне пример?
Ответы
Ответ 1
Используйте делегат 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;
});
Или назначьте лямбда переменной и передайте ее.
Ответ 2
Если я понимаю, вам нужен следующий код. (прохождение выражения 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));
Вы можете сделать то же самое в своем классе, см. пример.
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");
Надеюсь, это полезно
Ответ 3
Лямбда-выражения имеют тип Action<parameters>
(в случае, если они не возвращают значение) или Func<parameters,return>
(в случае, если они имеют возвращаемое значение). В вашем случае у вас есть два входных параметра, и вам нужно вернуть значение, поэтому вы должны использовать:
Func<FullTimeJob, Student, FullTimeJob>
Ответ 4
Вы должны использовать тип делегата и указать это как свой параметр команды. Вы можете использовать один из встроенных типов делегатов - Action
и Func
.
В вашем случае это выглядит так, как ваш делегат принимает два параметра и возвращает результат, поэтому вы можете использовать Func
:
List<IJob> GetJobs(Func<FullTimeJob, Student, FullTimeJob> projection)
Затем вы можете вызвать метод GetJobs
, переданный в экземпляре делегата. Это может быть метод, который соответствует этой сигнатуре, анонимному делегату или выражению лямбда.
P.S. Вы должны использовать PascalCase для имен методов - GetJobs
, а не GetJobs
.