C#’ta Çağıran Metod Bilgilerine Ulaşmak (CallerMemberName)
C# diliyle kodlama yaparken, zaman zaman bazı durumlarda, bir metodun hangi metoddan çağrıldığı, çağıran metod, bilgisine ulaşmamız gerekebiliyor. Örneğin loglama benim aklıma gelen durumlardan birisi, bir başka kullanım sebebi de, hatayı yakalamak olabilir. Bir metod sadece belli bir yerden çağrıldığında hataya düşebilir.
Bu durumlar için c# bize bazı kolaylıklar sunuyor. CallerMemberName özelliği.
Fakat daha önce c# dilinde böyle bir bilgiye nasıl ulaşabiliyorduk. Örnek bir program üzerinden bunu görelim:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace callermethod { class Program { private static void Add(int i, int j) { StackFrame frame = new StackFrame(1); var method = frame.GetMethod(); var name = method.Name; Console.WriteLine("CallerMethod:" + name); Console.WriteLine("Sum:" + (i + j).ToString()); } private static void MethodB() { Add(6,4); } private static void MethodA() { Add(2, 5); } static void Main(string[] args) { Add(5,6); MethodA(); MethodB(); Console.ReadLine(); } } }
İşaretli kısımlarda göründüğü gibi StackFrame nesnesi oluşturup onun üzerinden istediğimiz bilgiye ulaşıyoruz. Fakat bu yöntem, sistem kaynaklarını fazla tüketen bir alternatif.
Bunun yerine CallerMemberName, CallerFilePath, CallerLineNumber özelliklerini kullanarak, çağıran metod bilgisine ulaşabiliriz.
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; namespace callermethod { class Program { private static void Add( int i, int j, [CallerMemberName] string memberName = "", [CallerFilePath] string sourceFilePath = "", [CallerLineNumber] int sourceLineNumber = 0 ) { // Çağıran metodun bulunduğu dosyanın pathı, ve satır numarası isteniyorsa // CallerFilePath ve CallerLineNumber kullanılabilir. //Console.WriteLine("CallerFilePath:" + sourceFilePath); //Console.WriteLine("CallerLineNumber:" + sourceLineNumber); Console.WriteLine("CallerMethod:" + memberName); Console.WriteLine("Sum:" + (i + j).ToString()); } private static void MethodB() { Add(6,4); } private static void MethodA() { Add(2, 5); } static void Main(string[] args) { Add(5,6); MethodA(); MethodB(); Console.ReadLine(); } } }