none
Dinamik metot RRS feed

  • Soru

  • Merhaba,

    Aslına bakarsanız veritabanına veri yazmaktan sorumlu bir tek metot yazmaya çalışıyorum fakat zihnimi saatlerdir meşgul eden aşağıdaki probleme çözüm bulamadım.

    Problem şöyle ki; Örneğin X,Y ve Z olmak üzere 3 farklı veritabanı tablom olduğunu varsayalım. Öyle bir metot yazmaya çalışıyorum ki parametre olarak X sınıfı örneğini gönderdiğimde, gönderdiğim sınıf örneğinin propertylerini kolon adı, property değerlerini kolonların değeri ve X'sınıfının adını da veritabanına eklenecek tablo adı olarak ele alıp kaydedecek. Yine aynı metoda Y ve Z sınıf örneklerini gönderdiğimde de benzer şekilde davranacak.

    Sanırım yazmaya çalıştığım bu metodun gelişmiş haline Entity Framework deniyor fakat benim amacım Elbette Framework yazmak değil.

    Jenerik sınıf ve jenerik metotlara baktım isteğime cevap vermiyor, sizce bunu yapmaya uğraşmak akıl karımı ? Yoksa kestirmeden statik olarak X sınıfına yaz, Y sınıfına yaz, Z sınıfına yaz tarzında bana zul gelen bir yaklaşım mı sergilemeliyim ? Ya da nasıl bir yaklaşım sergilemeliyim bilemedim.

    Ayırdığınız vakit için,

    TEŞEKKÜRLER!


    Ve her bilgi sahininin üzerinde daha iyi bir bilen vardır.(Yusuf 12)


    • Düzenleyen x Master 28 Mart 2016 Pazartesi 12:37
    28 Mart 2016 Pazartesi 12:36

Yanıtlar

  • Yapmak istediğin şeye reflection deniliyor. 

    Örneği incele :

    public sealed class Kisi
    {
    	public int Id { get; set; }
    	public string Ad { get; set; }
    }
    
    void Main()
    {
    	var sefa = new Kisi { Id = 1, Ad = "Sefa" };
    	Islem(sefa);
    
    }
    
    
    public void Islem(object nesne)
    {
    	foreach (var property in nesne.GetType().GetProperties())
    	{
    		Console.WriteLine(string.Format("{0} : {1}", property.Name, property.GetValue(nesne)));
    	}
    }
    Fakat burada dikkat etmen mevzu şu, reflection çok yavaştır. Bu yüzden bu problemin önüne geçebilmek için bu typeların özelliklerini cachelemen gerekir. EF de bu ve benzeri bir çok konuya dikkat edilmiştir. Tavsiyem hobisel amaçlar dışında Amerika'yı tekrar keşfetmemek.
    • Düzenleyen Cihan YakarMVP 28 Mart 2016 Pazartesi 13:16
    • Yanıt Olarak İşaretleyen x Master 28 Mart 2016 Pazartesi 13:36
    • Yanıt İşaretini Geri Alan x Master 28 Mart 2016 Pazartesi 14:03
    • Yanıt Olarak Öneren sevdaca 28 Mart 2016 Pazartesi 17:59
    • Yanıt Olarak İşaretleyen x Master 29 Mart 2016 Salı 05:38
    28 Mart 2016 Pazartesi 13:16

Tüm Yanıtlar

  • Yapmak istediğin şeye reflection deniliyor. 

    Örneği incele :

    public sealed class Kisi
    {
    	public int Id { get; set; }
    	public string Ad { get; set; }
    }
    
    void Main()
    {
    	var sefa = new Kisi { Id = 1, Ad = "Sefa" };
    	Islem(sefa);
    
    }
    
    
    public void Islem(object nesne)
    {
    	foreach (var property in nesne.GetType().GetProperties())
    	{
    		Console.WriteLine(string.Format("{0} : {1}", property.Name, property.GetValue(nesne)));
    	}
    }
    Fakat burada dikkat etmen mevzu şu, reflection çok yavaştır. Bu yüzden bu problemin önüne geçebilmek için bu typeların özelliklerini cachelemen gerekir. EF de bu ve benzeri bir çok konuya dikkat edilmiştir. Tavsiyem hobisel amaçlar dışında Amerika'yı tekrar keşfetmemek.
    • Düzenleyen Cihan YakarMVP 28 Mart 2016 Pazartesi 13:16
    • Yanıt Olarak İşaretleyen x Master 28 Mart 2016 Pazartesi 13:36
    • Yanıt İşaretini Geri Alan x Master 28 Mart 2016 Pazartesi 14:03
    • Yanıt Olarak Öneren sevdaca 28 Mart 2016 Pazartesi 17:59
    • Yanıt Olarak İşaretleyen x Master 29 Mart 2016 Salı 05:38
    28 Mart 2016 Pazartesi 13:16
  • Abi yakıyosun,

    спасибо, dank, شكر, merci, salamat, תודה, obrigado, 감사, teşekkürler.


    Ve her bilgi sahininin üzerinde daha iyi bir bilen vardır.(Yusuf 12)

    28 Mart 2016 Pazartesi 13:35
  • Yani EF, LinqToSQL, DataSet gibi yapilardan birisini ya da birkacini yeniden kesfetmeye calisiyorsun :)

    Onlari dikkate almayip, yeniden yazmaya calistigin metodda cok dikkatli ol, istemeden buyuk guvenlik aciklari veriyor olabilirsin. IQToolkit'in kodu acik, onu inceleyebilirsin mesela.

    28 Mart 2016 Pazartesi 14:06
    Yanıtlayıcı
  • İşsizim Çetin abi :) boşa kürek sallamak hoşuma gidiyor, vaktim bol amatörce neler yapabilirim onu ölçmeye çalışıyorum. :).

    IQToolkit için ayrıca teşekkür ederim


    Ve her bilgi sahininin üzerinde daha iyi bir bilen vardır.(Yusuf 12)

    28 Mart 2016 Pazartesi 14:18
  • Birde Designer classı yazdınmı oldu sana EF :)

    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    28 Mart 2016 Pazartesi 15:49
    Moderatör
  • Cihan abi property cachleme hakkında da biraz bilgi kırıntısı paylaşabilirsen çıldırabilirim,

    Teşekkürler.


    Ve her bilgi sahininin üzerinde daha iyi bir bilen vardır.(Yusuf 12)

    30 Mart 2016 Çarşamba 12:57
  • Sürekli olarak 

    nesne.GetType().GetProperties()

    demek yerine en basidinden bir Dictionary<Type,IEnumerable<PropertyInfo>> gibi bir sözlük oluşturup, ilgili tip için ilk defa gelindiğinde sözlüğe ekleyip tekrar gelişlerde sözlükten devam edebilirsin.

    Benzer şekilde bunların mappinglerini de cachelemen iyi olacaktır. Yani string ise nvarchar türünden bir parametre, int ise int türünden bir parametre oluşturacağını bir yere yazabilirsin. Niye çünkü sql her zaman parametreler ile oluşturulmalı + ile değil... Güvenlik tarafında da dikkat etmen gereken çok şey var.

    30 Mart 2016 Çarşamba 13:15
  • TEŞEKKÜRLER!  Cihan Abi :D

    Ve her bilgi sahininin üzerinde daha iyi bir bilen vardır.(Yusuf 12)

    30 Mart 2016 Çarşamba 13:32