2010-01-12 28 views
46

Bu aptalca bir sorudur, ancak şu anda o yöntemde yürütülen yöntemin adını almak mümkün mü?Geçerli yöntemin adını edinin

Public Sub SomeMethod() 

    Dim methodName as String = System.Reflection.[function to get the current method name here?] 

End Sub 

Teşekkür

+0

Şuna bakın: http://geekswithblogs.net/opiesblog/archive/2006/06/29/83654.aspx –

+0

Gerçekte, şu anda yürütülen yöntem değil, çağrı yönteminin adı nasıl alınır. Yine de havalı! –

+0

Olası çoğaltması [Şu anda yürütülen yöntemin adını bulmak için yansıma kullanabilir misiniz?] (Http://stackoverflow.com/questions/44153/can-you-use-reflection-to-find-the-name-of –

cevap

97
+10

System.Reflection.MethodBase temel sınıfını daha iyi kullanın.GetCurrentMethod(); – marstone

+0

@marstone - Nedenini açıklar mısınız lütfen? – PunkyGuy

+5

@PunkyGuy Birisi şunları söyledi: “Her iki çağrı da tam olarak aynı etkiye sahip olsa da, genel olarak, tanımlanmış oldukları sınıfın alt sınıflarında Paylaşılan işlevleri çağırmak kötü bir fikirdir”. referans: http: //bytes.com/topic/visual-basic-net/answers/457334-methodinfo-methodbase – marstone

26

diğer yöntemler isteneni yakın, ancak bunlar dize değeri döndürmek yoktur. Ama bunu yapar:

Dim methodName$ = System.Reflection.MethodBase.GetCurrentMethod().Name 
+0

Bingo! benim için çözüldü –

1
Dim methodName As String = System.Reflection.MethodBase.GetCurrentMethod().Name 
3

Bu soruya sunulan cevapların hiçbirinde aslında zamanında (System.Reflection.MethodBase.GetCurrentMethod().Name) çalışmasını garanti etmek için, bir öznitelik eklemeniz gerekir. O aradan bu yöntemi biliyorum hiçbir derleyici/çalışma zamanı bayraklar vardır:

işlevi must be marked

  • F # adını [<System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)>]
  • VB almaya çalışıyoruz: <System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)>

  • C#: [System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]

Ayrıca günümüzde, VB nameof() operatör var, C# (and maybe F# soon) nameof(SomeMethod) olacağını dava için hangi (I sözdizimi burada VB ve C# için aynı olacağına inanıyorum)

3

başka bir yaklaşım kullanmak olacaktır System. Runtime'dan Caller​Member​Name​Attribute. İsteğe bağlı bir parametre yerleştirmek için Compiler Services ad alanı. Örneğin ...

Private Function GetMethodName(<System.Runtime.CompilerServices.CallerMemberName> 
    Optional memberName As String = Nothing) As String 

    Return memberName 

End Function 
beklediğiniz gibi işlev çağrılır olacağını

...
Public Sub DoSomeWork() 
    Dim methodName As String = GetMethodName() 
    Console.WriteLine($"Entered {methodName}") 

    ' Do some work 
End Sub 

yerine

'sadece' yöntemi adı alınıyor, fonksiyon aynı zamanda yöntemin yararı sağlayabilir Kodu daha da basitleştirmek için ad alındı. Örneğin ... Böyle kullanılabilecek

Private Sub TraceEnter(
    <System.Runtime.CompilerServices.CallerMemberName> 
    Optional memberName As String = Nothing) 

    Console.WriteLine($"Entered {memberName}") 

End Sub 

... ...

Public Sub DoSomeWork() 
    TraceEnter() 

    ' Do some work 

End Sub 
CompilerServices ad

diğer özellikler de (tam yolu almak için benzer şekilde kullanılabilir kaynak dosyanın ve/veya aramanın satır numarasının derlenmesi). Örnek kod için CallerMemberNameAttribute belgelerine bakın.

İlgili konular