2012-02-27 10 views
6

Czy można uzyskać obiekt MethodInfo z symbolu metody?Jak uzyskać MethodInfo z symbolu metody

Więc w tym samym duchu, jak:

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

Oto, co chcę zrobić:

public class Meatwad 
{ 
    MethodInfo method; 

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

    public void SomeMethod() { } 

} 

Jak mogłaby wdrożyć ReflectionThingy.GetMethodInfo? Biorąc pod uwagę, że jest to w ogóle możliwe, co z przeciążonymi metodami?

+1

Nieco związane z tym, czuję: [W Foof We Trust] (http://blogs.msdn.com/b/ericlippert/archive/2009/05/21/in-foof-we-trust-a-dialogue. aspx) –

Odpowiedz

2

Nie jest to możliwe bezpośrednio w języku C#. Ale można zbudować ten sam:

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*/); 
    } 

i używać go tak:

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

który zapewni Ci bezpieczeństwo w czasie kompilacji. Wydajność nie będzie jednak dobra.

+0

Dlaczego metoda ma parametr, który nigdy nie jest używany? – svick

+0

Skopiowałem to z klasy pomocniczej, która ma 200 LOC. Chciałem tylko o tym powiedzieć. Traktuj to jako pseudo-kod ;-) Pomysł jednak w pełni zadziała. – usr

+2

@usr Gdy wydajność staje się problemem, można ją łatwo rozwiązać, używając tego do inicjowania statycznych obiektów tylko do odczytu, zamiast wywoływać funkcję za każdym razem. – hvd

7

Delegaci zawierają numer MethodInfo w swoim Method property. Więc metoda pomocnika może być tak proste, jak:

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

Nie można przekształcić bezpośrednio z grupy metoda Delegate. Ale możesz użyć do tego obsady. Np .:

GetMethodInfo((Action)Console.WriteLine) 

Należy pamiętać, że to nie będzie działać, jeśli starają się zmieszać go z czymś takim roztworze usr za. Na przykład

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

zwróci MethodInfo dla wygenerowanego metody anonimowej, nie dla Console.WriteLine().

+0

Najbardziej podoba mi się to, ale ciekawe jest to, że można skonstruować akcję za pomocą tylko symbolu metody i uzyskać MethodInfo z właściwości Method akcji. W końcu to właśnie próbowałem nauczyć się robić. Jeśli będę miał trochę czasu, zdekompamuję Action, żeby zobaczyć, co się dzieje. –

Powiązane problemy