2009-06-16 43 views
6

Tôi đang cố gắng tìm ra nếu có một cú pháp đơn giản để chuyển đổi Nhóm phương pháp thành một biểu thức. Có vẻ như đủ dễ dàng với lambdas, nhưng nó không dịch với các phương pháp:Chuyển đổi nhóm phương thức thành Biểu thức

Với

public delegate int FuncIntInt(int x); 

tất cả các dưới đây là hợp lệ:

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

Nhưng nếu tôi cố gắng cùng với một phương pháp thể hiện, phương thức này được chia nhỏ theo Biểu thức:

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ả hai trường hợp cuối cùng không thể biên dịch bằng "C nhóm phương pháp chuyển đổi chú thích 'AFuncIntInt' thành loại không được ủy quyền 'System.Linq.Expressions.Expression < ...>'. Bạn có ý định gọi phương pháp này?"

Vậy là có một cú pháp tốt để chụp một Grou phương pháp trong một biểu thức?

cảm ơn, Arne

Trả lời

6

Làm thế nào về điều này?

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

Dooh .. Tôi cảm thấy ngu ngốc bây giờ. Điều đó hoạt động hoàn hảo. Cảm ơn –

+2

Bạn đã bao giờ tìm thấy một cú pháp đẹp hơn cho cái này chưa? Tôi không hoàn toàn hiểu tại sao trình biên dịch không thể tìm ra nhóm phương thức của một biểu thức > khi nó có thể tìm ra cho Func .. – skrebbel

+0

Giả định của tôi là foo.AFuncIntInt là một nhóm phương thức, không phải là một biểu thức và không có chuyển đổi tự động từ methodgroup thành biểu thức, tuy nhiên có chuyển đổi tự động để chấp nhận lambda như một nhóm phương thức hoặc một biểu thức –

0

Bạn cũng có thể làm điều đó bằng cách sử dụng NJection.LambdaConverter một đại biểu để chuyển đổi LambdaExpression Thư viện

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) 
    } 
} 
Các vấn đề liên quan