Serialize | Engin Polat\'ın Windows 8 , Windows Phone 8 ve C# içerikli programcılık sitesi

Arşiv

Etiketlenen yazılar serialize

C# CallerMemberName attribute

12 February 2013 Yorum yapılmamış

.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);
	}
}

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 :(

Kısa Sınav – 13

18 February 2010 Yorum yapılmamış

Geliştirdiğiniz bir Windows Forms uygulamasında aşağıdaki depolar.xml dosyasına sahipsiniz;

<? xml version="1.0" encoding="utf-8" ?>
<Depolar>
	<Depo Adi="DP001" Sehir="İstanbul"></Depo>
	<Depo Adi="DP002" Sehir="Ankara"></Depo>
	<Depo Adi="DP003" Sehir="Adapazarı"></Depo>
	<Depo Adi="DP004" Sehir="Elazığ"></Depo>
	<Depo Adi="DP005" Sehir="İzmir"></Depo>
</Depolar>

Bu Xml dosyasındaki depo isimlerini bir combobox‘a doldurmanız gerekmekte.

Sizce hangi yol tercih edilmeli?

  • Xml dosyasının şeması ile aynı serilize olabilen bir class geliştirilmeli. Geliştirilen class XmlDataDocument class’ı ile birlikte kullanılmalı
  • ApplicationSettingBase class’ından inherit olan yeni bir class yazılmalı
  • Xml dosyasının şeması ile aynı serilize olabilen bir class geliştirilmeli. Geliştirilen class XmlSerializer class’ı ile birlikte kullanılmalı
  • ConfigurationSection class’ından inherit olan yeni bir class yazılmalı

Sorunun doğru cevabı için; Devamını oku…