2012-06-30 13 views
5

.NET 4.5'ün [CallerMemberNameAttribute] adlı yeni bir özniteliğe sahip olduğunu fark ettik. Bu yöntem, bir yöntemin parametresine eklendiğinde adlı yöntemin dize adını sağlayacak Bu yöntemi (eğer bu mantıklıysa).C# Yığın İzi Olmadan Arama Yöntemi Alın

Ancak, maalesef (XNA ile bir şeyler yapmak istediğim için) yalnızca .NET 4.0'ı hedefliyorum.

ben böyle bir şey yapmak mümkün istiyorum:

void MethodA() { 
    MethodB(); 
} 

void MethodB() { 
    string callingMethodName = (...?); 
    Console.WriteLine(callingMethodName); 
} 

nerede çıktı Yöntemia olurdu.

Ben yığın izleme yoluyla bu yapabileceğini biliyorum, ama bu) bir Güvenilmez olduğunu ve bu bilgiyi toplamak için başka bir yolu varsa b) sloooow ... yüzden ... Ancak böyle olabilir,

merak ediyorum

Bu konuda herkesin sahip olabileceği herhangi bir fikir veya bilgi için umut ediyordum. Şimdiden teşekkürler :)

+3

Arama yöntemi adında bir dize olarak geçirme? – Oded

+2

@Oded Well evet açıkça MethodB ("MethodA") diyebilirim ancak nokta dinamik olarak yapmaya çalışıyorum, bu yüzden MethodA'yı MethodC'ye değiştirirsem bu aramayı da düzenlemek zorunda kalmam. – Xenoprimate

+0

Sorunun bu noktasında başarısız oldunuz. – Oded

cevap

13

Bunu derlemek için Visual Studio 2012 kullanıyorsanız, kendi CallerMemberNameAttribute'nu yazıp .NET 4.0 veya 3.5'ü hala hedeflemiş olsanız bile .NET 4.5 ile aynı şekilde kullanabilirsiniz. Derleyici, eski bir çerçeve sürümünü bile hedeflemede derleme zamanında yerine getirmeye devam edecektir.

Sadece hile olacaktır projenize aşağıdaki ekleyerek:

namespace System.Runtime.CompilerServices 
{ 
    public sealed class CallerMemberNameAttribute : Attribute { } 
} 
+0

Yalnızca bir hobi programcı Bu aptal soru ise çok üzgünüm, ama Microsoft'un CallerMemberNameAttribute için kaynak görebileceğiniz bir yolu var mı? Kopyalamak için demek istiyorum. – Xenoprimate

+2

Genel olarak, evet, .NET kitaplıklarını ILSpy kullanarak derleyebilirsiniz. http://wiki.sharpdevelop.net/ILSpy.ashx Ancak, özellikler nadiren başka bir kod tarafından nasıl kullanıldığına bağlı olduğundan, nadiren ilginç bir şey ortaya çıkarır. Örneğin. @ReedCopsey diyor kadarıyla dönüşüm değil özniteliği kendisi tarafından, derleyici tarafından derleme zamanında yapılır ve hatta .NET 4.5 çalışma zamanını gerekmez, bu nedenle hiçbir ilginç kodunu görmek olasıdır edeceğiz. –

+0

Ah, derleyici sadece adı 'CallerMemberNameAttribute' gördüğünü ve kendi mantığı ekler?Öyleyse, sadece bu adla boş bir nitelik oluşturabilir ve işe yarayacak mı? – Xenoprimate

0

Sen denilen yönteme parametre olarak Arayanın adını kaynağı olabilir. Eğer sorduğun ama yığın çerçevesini erişmeye gerek kalmadan çalışır Değil tamamen ne: MethodBase.GetCurrentMethod() kullanarak

[MethodImpl(MethodImplOptions.NoInlining)] 
void MethodA() 
{ 
    string methodName = System.Reflection.MethodBase.GetCurrentMethod().Name; 
    MethodB(methodName); 
} 

void MethodB(string callingMethodName) 
{ 
    Console.WriteLine(callingMethodName); 
} 

, kendi uygulama refactor güvenli kalmasını sağlayabilirsiniz - eğer yöntem değişikliklerinin adı, Sonuçlar hala doğru olurdu. yöntem satır içi uygulaması önlemek için

böylece MethodImplOptions.NoInlining ile arayarak yöntemi işaretlemek için unutmayın.