2009-06-16 4 views
6

메소드 그룹을 표현식으로 변환하기위한 간단한 구문이 있는지 알아 내려고하고 있습니다. 그것은 람다 충분히 쉽게 보이지만 방법에 번역하지 않습니다메소드 그룹을 표현식으로 변환

public delegate int FuncIntInt(int x); 

을 감안할 때 모두 아래 유효합니다

Func<int, int> func1 = x => x; 
FuncIntInt del1 = x => x; 
Expression<Func<int, int>> funcExpr1 = x => x; 
Expression<FuncIntInt> delExpr1 = x => x; 

하지만 난은과 같은 시도하는 경우 인스턴스 메서드를 사용하면 식에서 분해됩니다.

Foo foo = new Foo(); 
Func<int, int> func2 = foo.AFuncIntInt; 
FuncIntInt del2 = foo.AFuncIntInt; 
Expression<Func<int, int>> funcExpr2 = foo.AFuncIntInt; // does not compile 
Expression<FuncIntInt> delExpr2 = foo.AFuncIntInt;  //does not compile 

마지막 두 개는 모두 "C 메서드 그룹 'AFuncIntInt'를 'System.Linq.Expressions.Expression <>>'대리자가 아닌 형식으로 변환하십시오. 당신은 메소드를 호출하려고 했습니까? "

그래서 표현의 방법 GROU를 캡처 좋은 구문이?

감사 아르네을

답변

6

어떻게? 이것에 대해

Expression<Func<int, int>> funcExpr2 = (pArg) => foo.AFuncIntInt(pArg); 
    Expression<FuncIntInt> delExpr2 = (pArg) => foo.AFuncIntInt(pArg); 
+0

Dooh .. 나는 지금 어리 석다. 그건 완벽하게 작동합니다. 감사합니다 –

+2

당신은 이것에 대한 더 좋은 구문을 찾았습니까? 컴파일러가 Func 에 대해 알아낼 수있는 Expression >의 메서드 그룹을 알아 내지 못하는 이유를 완전히 이해하지 못합니다. – skrebbel

+0

내 생각에 foo.AFuncIntInt는식이 아닌 메서드 그룹입니다. 메소드 그룹에서 표현식으로의 자동 변환은 없지만 메소드 그룹 또는 표현식으로 람다를 허용하는 자동 변환이 있습니다. –

0

NJection.LambdaConverter을 사용하여 수행 할 수도 있습니다. 대리인 - 람다 변환 변환기 라이브러리

public class Program 
{ 
    private static void Main(string[] args) { 
     var lambda = Lambda.TransformMethodTo<Func<string, int>>() 
          .From(() => Parse) 
          .ToLambda();    
    } 

    public static int Parse(string value) { 
     return int.Parse(value) 
    } 
} 
관련 문제