2013-08-04 20 views
6

Czy można uzyskać nazwę innej metody w tej samej klasie, ale bez używając ręcznie napisanego ciągu?Jak uzyskać nazwę metody ze znanej metody?

class MyClass { 

    private void doThis() 
    { 
     // Wanted something like this 
     print(otherMethod.name.ToString()); 
    } 

    private void otherMethod() 
    { 

    } 
} 

Można zapytać dlaczego: a to dlatego, że muszę wywołać metodę później jak to Invoke („otherMethod”), ale nie chcę, aby zakodować ten ciąg siebie jako nie mogę byłaby to już w ramach projektu.

+0

możesz użyć refleksji, aby to osiągnąć. –

+0

Jaką wersję C# używasz? – Mehrdad

Odpowiedz

8

Jedno podejście można owinąć go do delegata Action, można uzyskać dostęp do nazwy metody:

string name = new Action(otherMethod).Method.Name; 
+1

Dzięki temu działa! Cholera szukałem w GetType() i GetMethods(), ale ta "nowa Akcja", o której nigdy nie słyszałem. Małe pytanie: kiedy używam nowej Akcji Mam nadzieję, że metoda wewnątrz nie zostanie wykonana (bierze tylko nazwę), czy to prawda? – Malvin

+2

Jeśli używasz podejścia delegowanego, nie musisz uzyskiwać nazwy (a więc pomijając wywoływanie poprzez odbicie) - po prostu użyj wynikowego 'Akcji', aby wykonać później metodę. –

+2

Woah! Całkiem niesamowite, nie wiedziałem, że możesz to zrobić. –

2

Można użyć refleksji (przykład - http://www.csharp-examples.net/get-method-names/), aby uzyskać nazwy metod. Możesz następnie wyszukać szukaną metodę według nazwy, parametrów lub nawet użyć atrybutu do oznaczenia go tagami.

Ale prawdziwe pytanie brzmi - czy jesteś pewien, że tego właśnie potrzebujesz? Wygląda na to, że nie potrzebujesz refleksji, ale musisz przemyśleć swój projekt. Jeśli już wiesz, jaką metodę chcesz wywołać, dlaczego potrzebujesz nazwy? A co powiesz na korzystanie z delegata? Lub wystawiając metodę przez interfejs i przechowuje odniesienie do jakiejś klasy implementującej to?

1

Spróbuj tego:

MethodInfo method = this.GetType().GetMethod("otherMethod"); 
object result = method.Invoke(this, new object[] { }); 
0

Btw. Zauważyłem również (w ekspansjach Internetu) alternatywne rozwiązanie tylko dla uzyskania ciągu metod. Działa również z parametrami i typami zwrotów:

System.Func<float, string> sysFunc = this.MyFunction; 
string s = sysFunc.Method.Name; // prints "MyFunction" 

public string MyFunction(float number) 
{ 
    return "hello world"; 
} 
+0

Jest to podejście stosowane przez zaakceptowaną odpowiedź. – Servy

+0

Jedyna różnica polega na tym, że działa to również na metodach bez próżni. – Malvin

+0

Podejście jest identyczne, trzeba oczywiście użyć typu "Action"/"Func", który pasuje do sygnatury metody. Przykład w OP jest pozbawioną parametrów funkcją void, co oznacza "Akcja". Nie możesz * użyć 'Func' dla takiej metody. – Servy