2012-02-27 37 views
6

Có thể lấy đối tượng MethodInfo từ một biểu tượng phương thức không?Cách lấy MethodInfo từ một ký hiệu phương thức

Vì vậy, trong bối cảnh đó như:

typeof(SomeClassSymbol) // this gets you a Type object 

Dưới đây là những gì tôi muốn làm:

public class Meatwad 
{ 
    MethodInfo method; 

    public Meatwad() 
    { 
     method = ReflectionThingy.GetMethodInfo(SomeMethod); 
    } 

    public void SomeMethod() { } 

} 

Làm thế nào tôi có thể thực hiện ReflectionThingy.GetMethodInfo? Với điều này thậm chí có thể ở tất cả, những gì về các phương pháp quá tải?

+1

Hơi liên quan, tôi cảm thấy: [Trong Foof Chúng tôi tin tưởng] (http://blogs.msdn.com/b/ericlippert/archive/2009/05/21/in-foof-we-trust-a-dialogue. aspx) –

Trả lời

2

Điều này không thể thực hiện trực tiếp với C#. Nhưng bạn có thể xây dựng này tự hỏi:

static MemberInfo MemberInfoCore(Expression body, ParameterExpression param) 
    { 
     if (body.NodeType == ExpressionType.MemberAccess) 
     { 
      var bodyMemberAccess = (MemberExpression)body; 
      return bodyMemberAccess.Member; 
     } 
     else if (body.NodeType == ExpressionType.Call) 
     { 
      var bodyMemberAccess = (MethodCallExpression)body; 
      return bodyMemberAccess.Method; 
     } 
     else throw new NotSupportedException(); 
    } 

    public static MemberInfo MemberInfo<T1>(Expression<Func<T1>> memberSelectionExpression) 
    { 
     if (memberSelectionExpression == null) throw new ArgumentNullException("memberSelectionExpression"); 
     return MemberInfoCore(memberSelectionExpression.Body, null/*param*/); 
    } 

Và sử dụng nó như thế này:

var methName = MemberInfo(() => SomeMethod()).MethodName; 

Điều đó sẽ cung cấp cho bạn thời gian biên dịch an toàn. Hiệu suất sẽ không được tốt mặc dù.

+0

Tại sao phương pháp của bạn có tham số không bao giờ được sử dụng? – svick

+0

Tôi đã sao chép nó ra khỏi lớp trợ giúp có 200 LOC. Tôi chỉ muốn đưa ra ý chính của nó. Hãy đối xử với điều này như giả mã ;-) Ý tưởng, mặc dù, sẽ làm việc đầy đủ. – usr

+2

@usr Khi hiệu suất trở thành một vấn đề, nó có thể dễ dàng được giải quyết bằng cách sử dụng điều này để khởi tạo các đối tượng chỉ đọc tĩnh, thay vì gọi hàm của bạn mỗi lần. – hvd

7

Đại biểu có chứa MethodInfo bạn muốn trong Method property. Vì vậy, phương pháp helper của bạn có thể đơn giản như:

MethodInfo GetMethodInfo(Delegate d) 
{ 
    return d.Method; 
} 

Bạn không thể chuyển đổi trực tiếp từ một nhóm phương pháp để Delegate. Nhưng bạn có thể sử dụng một dàn diễn viên cho điều đó. Ví dụ:

GetMethodInfo((Action)Console.WriteLine) 

Lưu ý rằng điều này sẽ không hoạt động nếu bạn cố gắng kết hợp với giải pháp của usr. Ví dụ

GetMethodInfo((Action)(() => Console.WriteLine())) 

sẽ trả lại MethodInfo đối với phương pháp vô danh tạo ra, không cho Console.WriteLine().

+0

Tôi thích điều này tốt nhất cho đến nay, nhưng điều thú vị là bạn có thể xây dựng một hành động chỉ với biểu tượng phương thức và lấy MethodInfo từ thuộc tính Phương thức của Hành động. Đó là cuối cùng những gì tôi đã cố gắng để tìm hiểu làm thế nào để làm. Nếu tôi có thời gian, tôi sẽ dịch ngược Hành động để xem chuyện gì đang diễn ra. –

Các vấn đề liên quan