2012-02-27 21 views
6

Yöntem simgesinden bir MethodInfo nesnesi almak mümkün mü?Yöntem yönteminden MethodInfo nasıl alınır?

Yani aynı damarda:

İşte
typeof(SomeClassSymbol) // this gets you a Type object 

yapmak istediğim şudur:

public class Meatwad 
{ 
    MethodInfo method; 

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

    public void SomeMethod() { } 

} 

Nasıl ReflectionThingy.GetMethodInfo uygulamak olabilir? Bu mümkün olsa bile, hatta aşırı yüklenmiş yöntemler hakkında ne?

+1

Biraz endişeliyim, hissediyorum: [Güvende Güveniz] (http://blogs.msdn.com/b/ericlippert/archive/2009/05/21/in-foof-we-trust-a-dialogue. aspx) –

cevap

2

Bu doğrudan C# içinde mümkün değildir.

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

Ve bu gibi kullanmak: Ama bu kendini inşa edebilirsiniz sen derleme zamanı güvenliğini sağlayacak

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

. Performans yine de iyi olmayacak.

+0

Neden yöntem hiç kullanılmamış bir parametreye sahip? – svick

+0

Bunu 200 LOC değerine sahip bir yardımcı sınıftan kopyaladım. Ben sadece onun özünü vermek istedim. Lütfen bunu sözde kod olarak ele al ;-) Fikir, yine de tamamen işe yarayacak. – usr

+2

@usr Performans bir sorun olduğunda, her seferinde işlevinizi çağırmak yerine, statik okuma nesnelerini başlatmak için bunu kullanarak kolayca çözülür. – hvd

7

Delegeler, Method property ürününde bulunan MethodInfo numaralarını içerir. Sen Delegate bir yöntem grubundan doğrudan dönüştüremezsiniz

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

: Yani yardımcın yöntemi olarak basit olabilir. Ama bunun için bir oyuncu kullanabilirsin. Örnek: USR'nin çözümü gibi bir şeyle karıştırmaya çalıştığınızda bunun işe yaramayacağını unutmayın. Örneğin

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

Console.WriteLine() için değil, oluşturulan anonim yöntem için MethodInfo döndürür.

+0

Şimdiye kadarki en iyiyi beğendim, ancak ilginç olan şey, yalnızca yöntem sembolü ile bir eylem inşa edebilmek ve İşlemin Yöntem özelliğinden MethodInfo elde edebilmenizdir. Nihayetinde nasıl yapacağımı öğrenmeye çalışıyorum. Biraz zamanım varsa neler olup bittiğini görmek için Eylemi derhal çözerim. –

İlgili konular