Bir sınıfın özellik, metod ve olaylarının belirli olmadığı nesne türüdür. Herhangi bir nesnenin herhangi bir öğesine erişmek kadar karmaşık bir fikir gibi görünse de bazen çok işe yaramakta. Özellikle COM+ ve Linq gibi işlevlerde çok ihtiyaç duyulmaktadır.
Dinamik bir nesne az öncede belirttiğim gibi iki önemli noktada karşımıza çıkıyor. COM+ olayı sadece Excel gibi Win32 katmanında ki bir uygulamaya erişme durumunda ihtiyaç duyabileceğiniz bir husus. Eğer Excel üzerinde işlem yapacaksanız veya çok daha karışık birşey diyelim C++ da geliştirmiş olduğunuz bir DLL kütüphanesine dinamik olarak erişmek istiyorsanız işte ihtiyacınızı karşılayacak şey dinamik nesnelerdir.
Dinamik olarak bir excel uygulamasına bağlanmak için System.InteropServices uzayındaki Activator nesnesini kullanacağız.
C# için:
dynamic xlApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
xlApplication.Visible = true;
VB.Net için:
Dim xlApplication As Object = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"))
xlApplication.Visible = True
Bu durumda elimizde xlApplication adında dinamik bir nesnemiz var. C# kullanıcıları için bu durum oldukça anlamlı
gelebilir. Malum dynamic tipinde bir nesne oluşturduk. Ancak iş VB.Net kullanıcılarına biraz tuhaf gelebilir.
Object nesnesine normalde dinamik erişim mantığıyla erişirseniz hata alırsınız. VB.Net yapay bir zekaya sahip olduğu
için dinamik ve dinamik olmayan nesneleri aynı tipte üretebilmesine rağmen bunların dinamikmi yoksa normal bir
tip dönüşümü ilemi üretildiğini fark edecektir.
Bu aşamada excel uygulaması görünür olacaktır. Visible özelliği önceden visualstudio tarafından bilinmesede hata
vermeden bu satırı çalıştıracaktır (genelde nesnenin özelliği olmayan bir özellik yazdığınızda kırmızı çizer ancak
dinamik bir nesnede bunu yapmayacaktır).
İkinci olarak dinamik nesneler Linq tarafından oluşturulur ki bu "select new" ile süren linq sorgularında gerçekleşir.
Microsoft bu aşamada select ile geri çekilen değerleri dinamik bir nesneye dönüştürerek satır içi oluşturduğunuz
(burada Lambda fonksiyonlarda dahil) nesnenin tipini önceden tahmin edemeyeceğiniz için bu yönteme başvurmuştur. Linq ile select new yapılan sorguların sonucunda elimize dinamik bir nesne getirmiş oluruz. Linq sorgularını sadece veri üzerinde düşünmeyip de nesneler ve/veya diziler üzerinde ve hatta araya biraz da data katarak karmaşık bir sonuç kümesinden yeni dinamik bir nesne oluşturmuş olursunuz. Bu ne işinize yarayacak? Nesne sınırlaması isteğinizi
yapmanıza engel oluyor ise burada dinamik nesneleri kullanmanız sizin için güzel bir yol olacaktır.
Bir daha ki yazımda görüşmek dileğiyle, esenlikle kalın...
0 yorum:
Yorum Gönder