Bilmek istediğin her şeye ulaş

Activator.CreateInstance metodunu neden ve hangi durumlarda kullanırız?

Activator.CreateInstance metodu, hedef gösterilen bir tipten (sınıf, type, class) örnek bir nesneyi dinamik olarak üretebilmemizi sağlar.

Person person1 = new Person();
Person person2 = Activator.CreateInstance<Person>();

Yukarıdaki, her iki satırın da sonucu, "Person" tipinde bir örnek nesne üretebilmektir.

Kullanım amacı; yazılılımın o anki gereksinime göre birbirinden çok farklı nedenler olabilir.

Bunlardan ilk akla gelen ve en çok kullanılanı; geliştirme aşamasında projeye referans olarak eklemediğiniz, ancak çalışma zamanında sonradan yüklenecek bir kütüphanede (assembly'de) yer alan bir tipi üretmek olabilir. Assembly adını ve tipin adını (namespace'i ile birlikte) , string parametre olarak geçerek, bu tipten bir örnek nesne elde etmek mümkündür.

object person1 = Activator.CreateInstance("MyProjectAssembly", "MyProjectAssembly.Data.MyObjects.Person");

Benzer bir örnekte, kullanacağınız nesneyi hangi tipten üretmeniz gerektiği, bir XML dosyasından veya uzak bir servisten size enum veya string bir parametre olarak geliyor olabilir.

Ya da, ortak bir class'dan inherit edilmiş, birden fazla sınıfla ilgili olarak generic işlem yapacak olan tek bir metot yaptığınızı düşünelim:

public class Hayvan {};
public class Kedi : Hayvan {};
public class Kopek : Hayvan {};
public class Fare : Hayvan {};
// ----------------
public static T YeniHayvan<T>()
{
T ornekHayvan = Activator.CreateInstance<T>();
if (ornekHayvan is Kedi)
{
DbContext.Kediler.Add(ornekHayvan);
}
else if (ornekHayvan is Kopek)
{
DbContext.Kopekler.Add(ornekHayvan);
}
else if (ornekHayvan is Fare)
{
DbContext.Fareler.Add(ornekHayvan);
}
DbContext.SaveChanges();
return T;
}
// ----------------
Kedi kedi1 = YeniHayvan<Kedi>();
Fare fare1 = YeniHayvan<Fare>();
Kopek kopek1 = YeniHayvan<Kopek>();

Çoğu zaman Activator. CreateInstance metotları tek başına yeterli olmamaktadır. Kullanacağınız tipin ve tipin ait olduğu assembly'nin tüm özelliklerine erişebilmek için, System. Reflection namespace'i içinde yer alan diğer işlemlere ihtiyaç duyulması mümkündür. Yani Activator sınıfındaki metotlara giriş yapmadan önce, . NET'in sunduğu Reflection özelliklerini anlamak ve incelemek yerinde olacaktır.

Kullanım amacını genellemek göründüğü gibi pek mümkün olmasa da, ilk akla gelen örnekten yola çıkarak, geliştirme aşamasında herhangi bir assembly referansından bağımsız, belli bir tipten örnek nesneyi çalışma zamanında elde edebilmek için kullanıldığını söyleyebiliriz.
  • Paylaş
1

Unluckypod, güzel açıklama teşekkür edrm

Sonraki Soru
HESAP OLUŞTUR

İstatistikler

377 Görüntülenme4 Takipçi1 Yanıt