2011-01-16 21 views
7
public static void Main(string[] args) 
{ 
    Action a =() => Console.WriteLine(MethodInfo.GetCurrentMethod().Name); 
    a(); 
} 

Bu kod, aşağıdaki gibi bir belirsiz dizgi döndürecektir: <Main>b__0.Anonim yöntemlerle MethodInfo.GetCurrentMethod() kullanma

Anonim yöntemleri göz ardı etmenin ve daha okunabilir bir yöntem adı almanın bir yolu var mı?

+6

Ve bir _anonymous_ yöntemi için hangi isimle bekliyorsunuz ?? –

+0

MS anon için kin tutmuyorum. yöntem adı üreteci. Sadece en yakın anonim olmayan yöntem için yığın izinde bir kazma yolu olup olmadığını merak ettim? Bir MethodInfo örneğinin anonim olduğunu bilmenin bir yolu var mı? – HuBeZa

cevap

6

Sen dışarıda yakalayabilecek :

var name = MethodInfo.GetCurrentMethod().Name + ":subname"; 
Action a =() => Console.WriteLine(name); 

Bunun dışında; yok hayır.

+0

Evet. Yakalanan değişkenlerin en iyi ve en basit çözüm olduğunu düşünüyorum. – HuBeZa

6

Hayır, yok. Bu yüzden anonim bir yöntem. Ad, derleyici tarafından otomatik olarak oluşturulur ve benzersiz olması garanti edilir. Eğer arama yöntemi adını almak istiyorsanız argüman olarak geçebileceği:

public static void Main() 
{ 
    Action<string> a = name => Console.WriteLine(name); 
    a(MethodInfo.GetCurrentMethod().Name); 
} 

yoksa gerçekten anlamlı bir ad istiyorsanız bunu sağlamak gerekir:

public static void Main() 
{ 
    Action a = MeaningfullyNamedMethod; 
    a(); 
} 

static void MeaningfullyNamedMethod() 
{ 
    Console.WriteLine(MethodInfo.GetCurrentMethod().Name); 
} 
+0

Maalesef, bir üçüncü taraf API'sı olduğu için parametreleri iletemiyorum ve bunun için sadece sarmak istemiyorum. Yığın izinde bir kazma yolu var mı? 'MethodInfo' örneğinin anonim olduğunu bilmenin bir yolu var mı? – HuBeZa

+2

@HuBeZa, MethodInfo'nun [CompilerGenerated] 'özniteliği ile dekore edilmiş olup olmadığını sınayabilirsiniz. Bu, anonim bir yöntem olmak için gerekli bir koşul ve iyi bir adaydır, ancak açık olarak yeterli bir durum değildir: 'var isCompilerGenerated = MethodInfo.GetCurrentMethod() .SDefined (typeof (CompilerGeneratedAttribute), true);' –

3

Anonim yöntemin içinde bulunduğu işlevin adını almak istiyorsanız, yığında gidebilir ve çağrı yönteminin adını alabilirsiniz. Bununla birlikte, bunun yalnızca istediğiniz yöntem adı hiyerarşide bir adım daha uzun olduğu sürece çalışacağını unutmayın. Belki de anonim olmayan bir yönteme ulaşıncaya kadar bir seyahat yolu vardır. Daha fazla bilgi için

bkz: http://www.csharp-examples.net/reflection-calling-method-name/