C# CallerMemberName attribute

.Net 4.5 ve C# 5 ile duyurulan CallerMemberName attribute’unun Loglama ve OnPropertyChanged method’unu daha kolay tetiklemek dışında ne işe yarayacağını uzun süre düşündükten sonra, internette gördüğüm bir makale ile aklıma bir fikir geldi. CallerMemberName attribute‘unun kullanım alanlarını inceleyelim;

Loglama

public static void LogException(string message, [CallerMemberName] string callerName = null, [CallerLineNumber] int lineNumber = 0, [CallerFilePath] string filePath = null) { Console.WriteLine(“Hata oluştu : {0}. Method : {1} Satır : {2} Dosya : {3}”, message, callerName, lineNumber, filePath); }

private static void Calculate() { try { /// Veritabanına bağlan, sorgulama yap, hesapla } catch (Exception ex) { LogException(ex.Message); } }</pre>

OnPropertyChanged

OnPropertyChanged method’unu C# 5‘ten önce şöyle tetikleriz;

protected virtual void OnPropertyChanged(string propertyName)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

private string _productName;
public string ProductName
{
    get { return _productName; }
    set
    {
        _productName = value;
        OnPropertyChanged("ProductName");
    }
}

C# 5 ile birlikte gelen CallerMemberName attribute’unu kullanarak aynı işi şu şekilde yapabiliriz;

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
    PropertyChangedEventHandler handler = PropertyChanged;
    if (handler != null)
    {
        handler(this, new PropertyChangedEventArgs(propertyName));
    }
}
 
private string _productName;
public string ProductName
{
    get { return _productName; }
    set
    {
        _productName = value;
        OnPropertyChanged();
    }
}

Strategy Pattern

CallerMemberName attribute‘unun yukarıdakilerden farklı kullanımı aşağıdaki gibi olabilir;

public class CustomSerializer
{
    public Func<string> Serialize { get; private set; }

    public CustomSerializer([CallerMemberName] string memberName = "")
    {
        if (memberName.Contains("Xml"))
        {
            Serialize = () => { return "xml"; };
        }
        else
        {
            Serialize = () => { return "json"; };
        }
    }
}

public static void WriteXml()
{
    var serializer = new CustomSerializer();
    Console.WriteLine(serializer.Serialize()); /// xml
}

public static void WriteJson()
{
    var serializer = new CustomSerializer();
    Console.WriteLine(serializer.Serialize()); /// json
}


Böylece, *CustomSerializer* class'ında bulunan *Serialize* method'unu çağıran method'un adında *Xml* anahtar kelimesi varsa *Serialize* method'u *xml serialization* yapacak, yoksa *json serialization* yapacak.

*Kaynak : Makaleyi tekrar bulamadım :(*

blog comments powered by Disqus

Engin Polat hakkında

Chief Architect, Microsoft RD, Microsoft MVP

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 459

Creative Commons Lisansı