2015-01-06 14 views
5

Tôi biết tôi đang yêu cầu kỳ lạ nhưng chỉ cho đá, có thể lấy MethodInfo cho một biểu thức lambda?Lấy MethodInfo cho một biểu thức lambda

tôi sau khi một cái gì đó như thế này:

(Func<int, string>(i => i.ToString())).MethodInfo

CẬP NHẬT Tôi muốn để có được các thông tin phương pháp bất kể cơ thể của lamda là một biểu thức gọi phương thức hay không, tức là không phụ thuộc loại biểu hiện cơ thể của lambda là gì.

Vì vậy, ví dụ:

Điều này có thể hiệu quả.

var intExpression = Expression.Constant(2); 
Expression<Func<int, Dog>> conversionExpression = i => Program.GetNewDog(i); 

var convertExpression5 = Expression.ConvertChecked(intExpression, typeof(Dog), ((MethodCallExpression)(conversionExpression.Body)).Method); 

class Program 
{ 
    static Dog GetNewDog(int i) 
    { 
    return new Dog(); 
    } 
} 

Nhưng tôi muốn ngay cả điều này để làm việc:

var intExpression = Expression.Constant(2); 
Expression<Func<int, Dog>> conversionExpression = i => new Dog(); 

var convertExpression5 = Expression.ConvertChecked(intExpression, typeof(Dog), /*...???... */); 
+0

Biểu thức không có thông tin về phương pháp. Nếu bạn biên dịch nó, bạn có thể lấy thông tin về phương thức từ đại biểu. – leppie

+0

Tôi không quan tâm đến việc tạo một biểu thức. Tôi đã thêm bản cập nhật này để trả lời câu trả lời của Timothy Shields dưới đây. Tất cả những gì tôi muốn là một methodInfo từ một đại biểu. Khả thi? –

+1

Điều này hoạt động tốt '(mới Func (i => i.ToString())) Phương pháp' – leppie

Trả lời

6

Bạn đang khá gần :)

Bạn có thể làm một cái gì đó như thế này:

MethodInfo meth = (new Func<int, string>(i => i.ToString())).Method; 

Lưu ý: Điều này có thể có vấn đề nếu bạn có nhiều thuê bao 'đến một thể hiện ủy nhiệm .

MSDN: http://msdn2.microsoft.com/en-us/library/system.delegate.method

+0

Nhưng làm thế nào có thể có nhiều người đăng ký một phương thức nặc danh hoặc một lambda? Làm thế nào bạn thậm chí sẽ tham khảo nó ở bất kỳ nơi nào khác hơn là nơi nó được tuyên bố? –

+0

Trước tiên, bạn phải khai báo đại biểu và sau đó sử dụng '+ =' để thêm người đăng ký bổ sung. Tôi đồng ý, với các đại biểu vô danh, kịch bản này là rất khó xảy ra. Bạn có thể kiểm tra nó mặc dù, hoặc 'Method' có thể là null trong trường hợp đó. Cũng cần lưu ý rằng delegate có thể có một số bối cảnh nếu thuộc tính 'Target' không phải là null. – leppie

+0

Ah, bây giờ tôi hiểu ý của bạn là gì. Bạn đang nói rằng nếu 'Func 'đã có các phương thức khác trong danh sách yêu cầu của nó, thì hãy cẩn thận, phải không? –

2

Sử dụng namespace System.Linq.Expressions, bạn có thể làm như sau.

Expression<Func<int, string>> expression = i => i.ToString(); 
MethodInfo method = ((MethodCallExpression)expression.Body).Method; 
+0

Hack thú vị. Cảm ơn bạn. :-) –

+0

Không, chờ đã. Điều đó sẽ chỉ hoạt động cho ví dụ cụ thể này. Lỗi của tôi. Tôi nên làm rõ. Tôi muốn nó hoạt động bất chấp những gì cơ thể của lambda chứa. Giải pháp này giả định rằng cơ thể của lambda là một biểu thức gọi phương thức, đó là lỗi của tôi, bởi vì tôi đã đưa ra một ví dụ như vậy. –