Arşiv

Etiketlenen yazılar json

Birkaç Faydalı Extension Method

C# 3.0 ile gelen Extension Method desteğini çok kullanışlı bulduğum için, kendi uygulamalarımda kullanmaya çalışıyorum. Bu yazımda faydalı bulduğum birkaç Extension Method‘u toplamaya çalıştım.

Metni Encrypt – Decrypt Eden Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static string Encrypt(this string stringToEncrypt, string key)
		{
			if (string.IsNullOrEmpty(stringToEncrypt))
				throw new ArgumentException("Boş metin şifrelenemez");
			if (string.IsNullOrEmpty(key))
				throw new ArgumentException("Şifreleme için anahtar vermelisiniz");

			CspParameters cspp = new CspParameters();
			cspp.KeyContainerName = key;

			RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspp);
			rsa.PersistKeyInCsp = true;

			byte[] bytes = rsa.Encrypt(UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true);

			return BitConverter.ToString(bytes);
		}

		public static string Decrypt(this string stringToDecrypt, string key)
		{
			if (string.IsNullOrEmpty(stringToDecrypt))
				throw new ArgumentException("Beş metnin şifresi çözülemez");
			if (string.IsNullOrEmpty(key))
				throw new ArgumentException("Şifre çözme için anahtar vermelisiniz");
			string result = null;
			try
			{
				CspParameters cspp = new CspParameters();
				cspp.KeyContainerName = key;

				RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspp);
				rsa.PersistKeyInCsp = true;

				string[] decryptArray = stringToDecrypt.Split("-");
				byte[] decryptByteArray = Array.ConvertAll<string, byte>(decryptArray, (s => Convert.ToByte(byte.Parse(s, NumberStyles.HexNumber))));
				byte[] bytes = rsa.Decrypt(decryptByteArray, true);

				result = UTF8Encoding.UTF8.GetString(bytes);
			}
			catch()
			{
			}
			return result;
		}
	}
}

Örnek kullanım;

string metin = "My Secret";
string sifrelenmis = metin.Encrypt("sifreleyici");
string sifresicozulmus = sifrelenmis.Decrypt("sifreleyici");

Listeler üzerinde Foreach Yapan Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static void ForEach<T>(this IEnumerable<T> kaynak, Action<T> islem)
		{
			foreach (var item in kaynak)
				islem(item);
		}
	}
}

Örnek kullanım;

List<string> isimler = new List<string> { "engin", "polat", "ahmet", "mehmet", "murat" };
isimler.ForEach(isim => MessageBox.Show(isim));

İnternet Adresi Doğrulayan Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static bool IsValidUrl(this string text)
		{
			Regex r = new Regex(@"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?");
			return r.IsMatch(text);
		}
	}
}

Örnek kullanım;

string Adres = "http://www.enginpolat.com";
bool AdresDogru = Adres.IsValidUrl();

Email Adresi Doğrulayan Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static bool IsValidEmail(this string text)
		{
			Regex r = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$");
			return r.IsMatch(text);
		}
	}
}

Örnek kullanım;

string Adres = "test@test.com";
bool AdresDogru = Adres.IsValidEmail();

Klasör Oluşturan Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static void CreateDirectory(this DirectoryInfo dirInfo)
		{
			if (dirInfo.Parent != null)
				CreateDirectory(dirInfo.Parent);
			if (!dirInfo.Exists)
				dirInfo.Create();
		}
	}
}

Örnek kullanım;

var dir = new DirectoryInfo(@"C:\temp\bir\iki\uc");
dir.CreateDirectory();

Tarihin Haftasonuna Geldiğini Doğrulayan Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static bool IsWeekend(this DateTime value)
		{
			return (value.DayOfWeek == DayOfWeek.Sunday || value.DayOfWeek == DayOfWeek.Saturday);
		}
	}
}

Örnek kullanım;

for (DateTime date = BaslangicTarih; date <= BitisTarih; date = date.AddDays(1))
{
	if (date.IsWeekend())
		continue;
	/// Tatil değil, yapılacak işler yapılır.
}

Object türünden JSON’a, JSON’dan Object Türüne Çeviren Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static string ToJson(this object obj)
		{
			JavaScriptSerializer serializer = new JavaScriptSerializer();
			return serializer.Serialize(obj);
		}

		public static T FromJson<T>(this object obj)
		{
			JavaScriptSerializer serializer = new JavaScriptSerializer();
			return serializer.Deserialize<T>(obj as string);
		}
	}
}

Örnek kullanım;

Personel Engin = new Personel("Engin Polat", 5000);
string json = Engin.ToJson();
Engin = null;
Engin = s.FromJson<Personel>();

Tarihten Yaş Hesaplayan Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static int Age(this DateTime tarih)
		{
			DateTime now = DateTime.Now;
			int yas = now.Year - tarih.Year;
			if (now < tarih.AddYears(yas))
				yas--;
			return yas;
		}
	}
}

Örnek kullanım;

DateTime AhmetDogumGunu = new DateTime(1979, 05, 07);
int Yas = AhmetDogumGunu.Age();

Ayın İlk Gününü – Ayın Son Gününü Bulan Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static DateTime FirstDayOfMonth(this DateTime date)
		{
			return new DateTime(date.Year, date.Month, 1);
		}

		public static DateTime LastDayOfMonth(this DateTime date)
		{
			return new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(1).AddDays(-1);
		}
	}
}

Örnek kullanım;

DateTime Simdi = DateTime.Now;
MessageBox.Show("Ayın ilk günü: " + Simdi.FirstDayOfMonth().ToShortDateString());
MessageBox.Show("Ayın son günü: " + Simdi.LastDayOfMonth().ToShortDateString());

Dosyanın MD5 Değerini Hesaplayan Extension Method

namespace ExtensionManager
{
	public static class Extensions
	{
		public static string GetMD5(this string filename)
		{
			string result = string.Empty;

			try
			{
				MD5CryptoServiceProvider md5Provider = new MD5CryptoServiceProvider();
				FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
				byte[] arrByteHashValue = md5Provider.ComputeHash(fileStream);
				fileStream.Close();

				string hashData = BitConverter.ToString(arrByteHashValue).Replace("-", "");
				result = hashData;
			}
			catch()
			{
			}
			return result.ToLower();
		}
	}
}

Örnek kullanım;

string Dosya = @"C:\Temp\DosyaAdi.txt";
MessageBox.Show(Dosya + " dosyasının MD5 değeri: " + Dosya.GetMD5());

Twitter Arama – Twitter Search

Bu yazımda, Twitter‘da arama yapan bir uygulama yazacağım. Siz de yazıyı baştan sona takip ederek, kendi twitter arama uygulamanızı yazabilirsiniz.

Hemen ekran tasarımımızı yapmakla işe başlayalım;

TwitterSearch_1

Sayfadaki elemanlar;

  • txtSonucAdet
  • txtSayfa
  • btnGeri
  • btnIleri
  • txtArama
  • btnArama
  • flowLayoutPanel1

Öncelikle Twitter Search API‘sini inceleyelim;

Search fonksiyonu geriye JSON formatında bilgi döndürüyor. Uygulamalarınızda JSON verilerini kullanabilmek için, şu sayfadan bulabileceğiniz JSON parser class’ını kullanabilirsiniz.

Şimdi, butonların (btnArama, btnGeri, btnIleri) Click olayını yazalım;

private void btnArama_Click(object sender, EventArgs e)
{
	txtSayfa.Text = "1";
	AramaYap();
}
private void btnGeri_Click(object sender, EventArgs e)
{
	int Sayfa = Convert.ToInt32(txtSayfa.Text) - 1;
	txtSayfa.Text = Sayfa < 1 ? "1" : Sayfa.ToString();
	AramaYap();
}
private void btnIleri_Click(object sender, EventArgs e)
{
	txtSayfa.Text = (Convert.ToInt32(txtSayfa.Text) + 1).ToString();
	AramaYap();
}

Butonların Click olaylarının kalbinde AramaYap() methodu yatıyor. Hemen yazalım;

private void AramaYap()
{
	flowLayoutPanel1.Controls.Clear();

	WebRequest wr = WebRequest.Create(string.Format("http://search.twitter.com/search.json?q={0}&rpp={1}&page={2}", txtArama.Text, txtSonucAdet.Value, txtSayfa.Text));
	Stream s = wr.GetResponse().GetResponseStream();
	StreamReader sr = new StreamReader(s);
	string Sonuc = sr.ReadToEnd();

	Hashtable hs = (Hashtable)JSON.JsonDecode(Sonuc);

	foreach (Hashtable oItem in (ArrayList)hs["results"])
		flowLayoutPanel1.Controls.Add(CreateTwitItem(oItem));
	}

AramaYap() method’unda ilk iş, flowLayoutPanel’i temizliyoruz.

Daha sonra, Twitter Search API‘den öğrendiğimiz gibi, http://search.twitter.com/search.json adresine uygun parametreler ile sorgu atıyoruz.

Gelen bilgi JSON formatında olduğu için, JSON parser class’ımızı kullanıyoruz (JSON.JsonDecode) ve sonuç bilgisini Hashtable formatına çeviriyoruz.

Hashtable‘ın results öğesi ArrayList formatındadır ve arama sonucunun herbir satırını ifade etmektedir. Bu yüzden basit bir foreach döngüsü ile flowLayoutPanel’e ekleme yapıyoruz.

flowLayoutPanel’e ekleyeceğimiz her nesne CreateTwitItem fonksiyonunda oluşturuluyor;

private Panel CreateTwitItem(Hashtable TwitItem)
{
	Panel p = new Panel();

	string from_user = TwitItem["from_user"] != null ? TwitItem["from_user"].ToString() : "";
	string to_user = TwitItem["to_user"] != null ? TwitItem["to_user"].ToString() : "";
	string text = TwitItem["text"] != null ? TwitItem["text"].ToString() : "";
	string profile_image_url = TwitItem["profile_image_url"] != null ? TwitItem["profile_image_url"].ToString() : "";
	string tweet_id = TwitItem["id"] != null ? TwitItem["id"].ToString() : "";
	DateTime created_at = TwitItem["created_at"] != null ? DateTime.Parse(TwitItem["created_at"].ToString()) : DateTime.Now;
	string twitter_url = string.Format("http://twitter.com/{0}/statuses/{1}", from_user, tweet_id);

	p.Size = new Size(flowLayoutPanel1.Width - 23, 60);
	p.BorderStyle = BorderStyle.FixedSingle;

	PictureBox pb = new PictureBox();
	pb.Dock = DockStyle.Left;
	pb.Size = new Size(50, 50);
	pb.BorderStyle = BorderStyle.FixedSingle;
	pb.Load(profile_image_url);

	Label l1 = new Label();
	l1.AutoSize = false;
	l1.Location = new Point(pb.Width, 2);
	l1.Size = new Size(300, 15);
	l1.Text = string.Format("@{0} -> @{1} ({2} {3})", from_user, to_user, created_at.ToShortDateString(), created_at.ToShortTimeString());

	Label l2 = new Label();
	l2.AutoSize = false;
	l2.Location = new Point(pb.Width, 19);
	l2.Size = new Size(flowLayoutPanel1.Width - pb.Width - 20, 38);
	l2.Text = text;

	LinkLabel l3 = new LinkLabel();
	l3.Text = "Sayfaya Git";
	l3.Location = new Point(flowLayoutPanel1.Width - (l3.Width - 10), 2);
	l3.Click += delegate { Process.Start(twitter_url); };

	p.Controls.Add(pb);
	p.Controls.Add(l1);
	p.Controls.Add(l2);
	p.Controls.Add(l3);

	p.MouseEnter += delegate { p.BackColor = Color.LightYellow; };
	pb.MouseEnter += delegate { p.BackColor = Color.LightYellow; };
	l1.MouseEnter += delegate { p.BackColor = Color.LightYellow; };
	l2.MouseEnter += delegate { p.BackColor = Color.LightYellow; };
	p.MouseLeave += delegate { p.BackColor = SystemColors.Control; };
	l2.MouseLeave += delegate { p.BackColor = SystemColors.Control; };

	return p;
}

CreateTwitItem() fonksiyonunda bir Panel nesnesi oluşturup, içerisine bir picturebox, iki label, bir linklabel ekliyoruz ve geriye Panel nesnesini döndürüyoruz. Böylece foreach’in her adımında flowLayoutPanel’e yeni Panel nesnesi ekleniyor.

Uygulamamızı çalıştırıyoruz ve işte örnek ekran görüntüsü;

TwitterSearch_2

İsterseniz uygulamanın kodlarını buradan indirebilirsiniz.