2009-06-16 11 views
6

Próbuję dowiedzieć się, czy istnieje prosta składnia do konwersji grupy metod na wyrażenie. Wydaje się dość łatwo z lambda, ale nie przekłada się metodami:Konwertuj grupę metod na wyrażenie

Given

public delegate int FuncIntInt(int x); 

wszystkie wymienione poniżej obowiązują:

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

Ale jeśli próbuję samo ze związkiem Metoda instancji rozkłada się na Wyrażenia:

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 

Obie z dwóch ostatnich nie kompilują się z "C nie konwertuj grupy metodowej "AFuncIntInt" na nieprzydzielone typu "System.Linq.Expressions.Expression < ...>". Czy zamierzają wywołać metodę?”

Więc jest to dobry składnia do przechwytywania metoda A Grou w wyrażeniu?

dzięki, Arne

Odpowiedz

6

Jak o tym?

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

Dooh .. Teraz czuję się głupio. To działa idealnie. Dzięki –

+2

Czy kiedykolwiek znalazłeś ładniejszą składnię tego? Nie do końca rozumiem, dlaczego kompilator nie może obliczyć grupy metod Wyrażenia > kiedy może to zrozumieć dla Func .. – skrebbel

+0

Moje założenie jest takie, że foo.AFuncIntInt jest grupą metod, a nie wyrażeniem i nie ma automatycznych konwersji z grupy metod do wyrażenia, jednak istnieje automatyczna konwersja, aby zaakceptować lambdę jako grupę metod lub wyrażenie –

0

Możliwe jest również wykonanie tego przy użyciu NJection.LambdaConverter konwertera Delegat na konwerter LambdaExpression Biblioteka

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