2016-06-29 22 views
19

Przeglądasz, przeszukujesz i masz nadzieję, ale nie możesz znaleźć prostej odpowiedzi.Używanie nameof do uzyskania nazwy aktualnej metody

Czy mimo to w C# 6.0 pobierano bieżącą nazwę metody za pomocą nameof bez podania nazwy metody?

dodaję moje wyniki badań do słownika tak:

Results.Add(nameof(Process_AddingTwoConsents_ThreeExpectedRowsAreWrittenToStream), result); 

wolałbym, gdybym nie musiał podać nazwę metody wyraźnie więc mogę skopiować + wklej linii, nie- przykładem pracy:

Results.Add(nameof(this.GetExecutingMethod()), result); 

Jeśli to możliwe nie chcę użyć refleksji.

UPDATE

To nie jest (jak sugerowano) duplikat this question. Pytam, czy jest możliwe jawne użycie nameof bez (!) Odbicia, aby uzyskać bieżącą nazwę metody.

+1

A dlaczego nie używasz tego: http://stackoverflow.com/questions/44153/can-you-use-reflection-to-find-nazwa-the-the-currently-executing-method? – HimBromBeere

+0

Możesz użyć 'StackTrace', aby uzyskać takie informacje, ale jest to powolne. Aby osiągnąć coś automatycznego, możesz użyć generowania kodu (np. Narzędzia uruchamianego przed kompilatorem i zamieniającego coś na coś innego) lub AOP (zobacz [to] (http://stackoverflow.com/q/25803/1997232)). – Sinatr

+0

Czy to nie wystarczy? 'System.Reflection.MethodInfo.GetCurrentMethod(). Nazwa' – Zorkind

Odpowiedz

47

Nie można używać nameof Aby to osiągnąć, ale co z tym obejściem:

Poniższy fragment nie zawiera bezpośredniego odbicia (podobnie jak nameof) i nie ma rozszerzenia nazwa metody cit.

Results.Add(GetCaller(), result); 

public static string GetCaller([CallerMemberName] string caller = null) 
{ 
    return caller; 
} 

GetCaller zwraca nazwę dowolnej metody, która wywołuje go.

+0

Dlaczego głosowanie w dół? – user3185569

+0

Jak to pomaga? Potrzebujesz wywoływacza metody wykonawczej, a nie wywołującego "GetCaller"; chyba że proponujesz dodanie opcjonalnego parametru do * wszystkich * potencjalnie możliwych do wywołania metod w celu wykonania tej pracy, która jest, szczerze mówiąc, ohydna. – InBetween

+2

@InBetween OP stwierdził '" pobranie bieżącej nazwy metody "'. To robi dokładnie to, co powiedział! Potrzebujesz tylko jednej metody "GetCaller", z której możesz zadzwonić z dowolnego miejsca, aby uzyskać bieżącą nazwę metody wykonywania. – user3185569

0

Jeśli chcesz dodać nazwę bieżącej metody do listy wyników następnie można użyć to:

StackTrace sTrace= new StackTrace(); 
StackFrame sFrame= sTrace.GetFrame(0); 
MethodBase currentMethodName = sFrame.GetMethod(); 
Results.Add(currentMethodName.Name, result); 

Albo można użyć,

Results.Add(new StackTrace().GetFrame(0).GetMethod().Name, result);  
+3

Uwaga, że ​​prawdopodobnie nie jest wiarygodna, ponieważ metoda może być inline. Spodziewałbym się też, że będzie dość powolny. – svick

+0

Ogólnie nie powinieneś nigdy używać tych klas w kodzie produkcyjnym –

+1

'System.Reflection.MethodInfo.GetCurrentMethod()' zrobi to łatwiej (i prawdopodobnie szybciej) – GreatAndPowerfulOz