C # 메서드 매개 변수로 Lambda 식 전달


105

전달하고 재사용 할 수있는 람다식이 있습니다. 코드는 다음과 같습니다.

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를 사용하고 싶다고 가정하고 있지만 구문이 무엇인지 또는 어떻게 작동하는지 잘 모르겠습니다. 누군가 나에게 예를 들어 줄 수 있습니까?


3
매개 변수를 Action 또는 Func로 만듭니다.
Metro Smurf

맞아요, 그게 제가 생각했던 것입니다 ... 제가 이걸 어떻게했는지 보여 주실 수 있나요?
Adam Levitt 2013 년

답변:


122

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;
        });

또는 람다를 변수에 할당하고 전달 합니다 .


이것은 매우 좋아 보이며이 getJobs 메서드의 외부에 람다를 어떻게 정의할까요? 즉, 람다를 정의하기 위해 getJobs ()를 호출하기 전의 줄은 무엇입니까?
Adam Levitt 2013 년

@AdamLevitt-예제 코드와 같은 방식입니다. 답변에 추가됩니다.
Oded

또한 함수 매개 변수가 어쨌든 동적 일 수 있습니까?
Adam Levitt 2013 년

@AdamLevitt-함수를 제네릭으로 만들 수 있지만 람다에 다른 개수의 매개 변수를 원하면 오버로드가 필요합니다.
Oded

권리. 내가 실제로 원하는 것은 IJob 인터페이스의 다른 구현을 전달할 수 있지만 런타임에 실제 일반 impl 클래스가 필요하기 때문에 Dapper의 Query <>에서는 작동하지 않습니다. 이것은 내가 바라던 것에 여전히 매우 가깝습니다.
Adam Levitt

27

내가 이해하면 다음 코드가 필요합니다. (매개 변수로 표현식 람다 전달) 방법

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");

도움이 되었기를 바랍니다.


2
우리가 필요한 이유를 설명 할 수 Compile().Where? 그것 없이도 작동하는 것을 보았습니다.
Sнаđошƒаӽ

7

Lambda 식에는 Action<parameters>(값을 반환하지 않는 경우) 또는 Func<parameters,return>(반환 값이있는 경우) 유형이 있습니다. 귀하의 경우에는 두 개의 입력 매개 변수가 있고 값을 반환해야하므로 다음을 사용해야합니다.

Func<FullTimeJob, Student, FullTimeJob>

5

대리자 유형을 사용하고이를 명령 매개 변수로 지정해야합니다. - 당신은 대리인 유형에 내장 된 중 하나를 사용할 수 ActionFunc.

귀하의 경우에는 대리자가 두 개의 매개 변수를 사용하고 결과를 반환하므로 다음을 사용할 수 있습니다 Func.

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

그런 다음 GetJobs델리게이트 인스턴스를 전달하는 메서드 를 호출 할 수 있습니다. 이는 해당 서명, 익명 대리자 또는 람다 식과 일치하는 메서드 일 수 있습니다.

- PS 당신은 메소드 이름에 대한 PascalCase을 사용해야 GetJobs하지 getJobs.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.