İçeriğe geç

Generic Tip Üretimi ve Metot Çağırma

Projemizde dinamik şekilde değişken tipi üretmemiz gerektiği ve bu ürettiğimiz değişken tipine ilgili metot sayesinde veri atamamız gerektiğine ilişkin bir ihtiyaç doğduğunu varsayalım.

Senaryomuz gereği elinizde N sayıda entity bulunsun ve biz entity ismini string olarak göndererek çalışma zamanında veri çekmeye çalışalım.

Öncelikle veriye erişimi sağlayabildiğimiz bir generic metot hazırlayalım.

        public List<T> GetData<T>(int key) where T : BaseEntity, new()
        {
            //İlgili veriye erişim işlemleri...
            return new List<T>();
        }

Şimdi entity ismini string olarak verdiğimizi düşünelim ve bir tane property hazırlayalım. Property içine atayacağımız değer isim uzayı ismi ve entity ismi olmalıdır.

        public static string EntityName
        {
            get
            {
                //Type Name, Namespace Name
                return string.Format("{0}.Person, {0}", typeof(Program).Namespace);
            }
        }

Şimdi bu yazdığımız string tipindeki entity için çalışma zamanında tip üretimi hazırlayalım.

            Type genericListType = typeof(List<>);
            //Entity ismini arguman olarak ekliyoruz.
            Type[] genericTypeArgument = { Type.GetType(EntityName) };
            //List<Person> tipi çıktısı.
            Type realType = genericListType.MakeGenericType(genericTypeArgument);

Şimdi çalışma zamanında üretmiş olduğumuz tipe değer atayabilmek için veri erişim metodumuzu çalışma zamanında çağırabiliriz.

            MethodInfo genericMethod = typeof(DataAccessHelper).GetMethod("GetData");
            MethodInfo realMethod = genericMethod.MakeGenericMethod(genericTypeArgument);

Son olarak çalışma zamanında oluşturmuş olduğumuz tipe veri atayabilmek için bir tane instance oluşturmalıyız ve sonrasında buna çalışma zamanında oluşturduğumuz metot sayesinde değer vereceğiz.

            //List<Person> tipi oluşturulur!
            object realTypeInstance = Activator.CreateInstance(realType);
            realTypeInstance = realMethod.Invoke(new DataAccessHelper(), new object[] { 1 });

realTypeInstance isimli değişkenin tipini ekrana yazdırdığımızda aşağıdaki gibi bir sonuca ulaştığımızı göreceğiz.

GenericType

Özetle toparlayacak olursak; projelerimizde çalışma zamanında tip ve method üretimine ihtiyaç duymamız olasıdır. Bu durumlarda nasıl tip üretimi ve method üretimi yapacağımıza ilişkin ve bunları çalışma zamanında nasıl kullanacağımıza ilişkin kodlamayı incelemeye çalıştık.

Not: çalışma zamanında tip ve method üretimi belkide çoğu projede ihtiyaç duyulmayacak konular olabilir. Fakat bu tip yapılar bize esneklik sağlar ve hazırladığımız esnek yapılar belkide başka projelerimizde bize altyapı oluşturabilecektir.

Örnek console projesini buradan indirebilirsiniz.

Tarih:C#

İlk Yorumu Siz Yapın

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.