İlkay İlknur

just a developer...

Expando Object İçerisine Dinamik Olarak Member Ekleme

C# 4.0'daki dynamic yenilikleri ile beraber hayatımıza giren tiplerden biri de ExpandoObject. Bu tip ne işe yarıyor diye ufak bir hatırlatma yaparsak, ExpandoObject'in içerisine runtime'da dinamik olarak member eklenebiliyor. Örneğin,

class Program
{
    static void Main(string[] args)
    {
        dynamic d = new ExpandoObject();
        d.Foo = "foo";
        d.Bar = 4;

        Console.WriteLine("Foo=" + d.Foo);
        Console.WriteLine("Bar=" + d.Bar.ToString());
    }
}

Gördüğünüz gibi runtimeda Foo ve Bar fieldlarını ekledik ve sonrasında da bu fieldları ekrana yazdırdık. Buraya kadar olan kısmını zaten ExpandoObjecti biliyorsanız size yabancı gelmeyecektir.

ExpandoObject kullanırken oluşabilecek olan ihtiyaçlardan biri de ExpandoObject içerisine koyacağımız alanların runtimeda belirlenmesi olabilir. Yani üstteki örnekteki Foo ve Bar alanlarının isimlerinin ve valuelarının database'den geldiğini düşünün. Kodunuza göre bu alanların adı Foo ve Bar olabiliyorken aynı zamanda Ahmet ve Mehmet de olabilir. Bu tamamen databaseden gelecek sonuca bağlı. Bu durumda haliyle d.Foo veya d.Ahmet gibi birşey yapamıyoruz.  Çünkü ne geleceği belli değil. Peki burada nasıl ilerleyebiliriz ?

ExpandoObject'in tanımına bakarsınız IDictionary<string, object> interface'ini implemente ettiğini görürsünüz. Dolayısıyla bu da bize istediğimiz başarmamızın yollarını açıyor :)

class Program
{
    static void Main(string[] args)
    {
        dynamic d = new ExpandoObject();
        IDictionary<stringobject> members = d as IDictionary<stringobject>;
        members.Add("Foo""foo");
        members.Add("Bar", 4);

        Console.WriteLine("Foo=" + d.Foo);
        Console.WriteLine("Bar=" + d.Bar.ToString());
    }
}

Tabi yukarıda dictionary içerisine eklediğimiz alanların dinamik olarak bir yerlerden geldiğini(mesela databaseden yada bir API'dan) düşünmenizde fayda var :) Bu kullanım bahsettiğim gibi dinamik object içerisinde bulunacak olan alanların dışarıdan belirlendiği senaryolarda oldukça anlamlı ve kullanılabilir. Ufak ama lazım olduğunda hayat kurtaran bir nokta :)



Yorum Gönder