2013-08-04 22 views
6

Başka bir yöntemin adı, aynı sınıfta ancak el ile yazılmış bir dize kullanılarak alınabilir mi?Yöntem adı bilinen bir yöntemden nasıl alınır?

class MyClass { 

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

    private void otherMethod() 
    { 

    } 
} 

Nedenini sorabilir: kuyu nedeni bu Invoke ("otherMethod") gibi sonradan yöntemi çağırmak gerektiğini, ancak ben planı ayrı olamaz bu dize kendim hardcode istemiyoruz Artık projenin içinde. - yöntem isimleri almak için

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

Bunu elde etmek için yansımayı kullanabilirsiniz. –

+0

C# hangi sürümünü kullanıyorsunuz? – Mehrdad

cevap

8

Bir yaklaşım o zaman yöntemin adını erişebilir, temsilci Action içine sarın olduğunu. Ardından, aradığınız yöntemi ad ve parametrelerle arayabilir veya etiketlemek için bir öznitelik kullanabilirsiniz.

Ama asıl soru şu: İhtiyacın olan şey olduğuna emin misin? Bu, düşünceye gerçekten ihtiyacınız yok gibi görünüyor, ama tasarımınızı düşünmeniz gerekiyor. Hangi yöntemi çağırdığınızı zaten biliyorsanız, neden isme ihtiyacınız var? Bir delege kullanmak nasıl? Ya da bir arabirim aracılığıyla yöntemi açıklamak ve onu uygulayan bir sınıfa bir referans vermek mi?

+1

Bu çalışmalara teşekkürler! Lanet olsun GetType() ve GetMethods() ama hiç duymadım bu "yeni eylem" baktım. Küçük soru: Yeni Eylem'i kullandığımda, içindeki yöntemin idam edilmediğine inanıyorum (sadece ismi alır), bu doğru mu? – Malvin

+2

Temsilci yaklaşımıyla devam ederseniz, ad almanız gerekmez (ve dolayısıyla yansıma aracılığıyla atlama atlanır) - daha sonra yöntemi çalıştırmak için yalnızca "Action" sonucunu kullanın. –

+2

Woah! Oldukça harika, bunu yapabileceğini bilmiyordum. –

1

bu deneyin:

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

Btw. Ayrıca (internetin genişlemelerinde) sadece bir metod dizisini elde etmek için alternatif bir çözüm buldum. Ayrıca, parametreleri ve dönüş türleriyle de çalışır:

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

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

Bu, kabul edilen yanıt tarafından kullanılan yaklaşımdır. – Servy

+0

Tek fark, bu da geçersiz olmayan yöntemler üzerinde de çalışır. – Malvin

+0

Yaklaşım aynıdır, yöntemin imzasıyla eşleşen 'Action' /' Func' türünü kullanmanız gerekir. OP'deki örnek, 'Action' anlamına gelen parametresiz bir boş işlevdir. Böyle bir yöntem için * Func kullanamazsınız. – Servy

İlgili konular