SORU
31 EKİM 2009, CUMARTESİ


ExpandoObject gerçek faydaları nelerdir?

ExpandoObject sınıfı eklenecektir .NET 4 keyfi olarak çalışma zamanında bir nesnenin üzerine özellikleri ayarlamanızı sağlar.

Dictionary<string,object> ya da gerçekten bile bir bir kullanarak bu Hashtable herhangi bir avantajları var mı? Söyleyebileceğim kadarıyla, bu başka bir şey ama biraz daha kısa ve öz sözdizimi ile erişebilirsiniz karma bir tablo.

Örneğin, bu yüzden:

dynamic obj = new ExpandoObject();
obj.MyInt = 3;
obj.MyString = "Foo";
Console.WriteLine(obj.MyString);

Gerçekten daha iyi, yoksa çok daha farklı:

var obj = new Dictionary<string, object>();
obj["MyInt"] = 3;
obj["MyString"] = "Foo";

Console.WriteLine(obj["MyString"]);

Negerçekavantajları zamanında sadece keyfi bir sözlük türü, belirlenecek olan bir türünü kullandığını belli olmaması dışında kullanmak yerine ExpandoObject kullanarak elde edilir.

CEVAP
2 Kasım 2009, PAZARTESİ


Başvuruyorsunuz TechNet makale yazdı beri, bu bir cevap vermek zorundayım.

İlk olarak, bu soruyu bekliyordum ve o ExpandoObject için daha fazla veya daha az gerçek kullanım örneği gösteren bir blog yazısı yazdım: Dynamic in C# 4.0: Introducing the ExpandoObject.

Kısa bir süre sonra, ExpandoObject karmaşık hiyerarşik nesneleri oluşturmanıza yardımcı olabilir. Örneğin, bir sözlük içinde bir sözlük olduğunu düşünün:

Dictionary<String, object> dict = new Dictionary<string, object>();
Dictionary<String, object> address = new Dictionary<string,object>();
dict["Address"] = address;
address["State"] = "WA";
Console.WriteLine(((Dictionary<string,object>)dict["Address"])["State"]);

Derin bir hiyerarşi olduğunu, çirkin olduğunu kodu. ExpandoObject ile zarif ve okunabilir kalır.

dynamic expando = new ExpandoObject();
expando.Address = new ExpandoObject();
expando.Address.State = "WA";
Console.WriteLine(expando.Address.State);

Zaten işaret edildi ikinci olarak da, ExpandoObject uygulayan bir sözlük daha özellikleri üzerinde daha fazla kontrol sağlayan arayüz INotifyPropertyChanged.

Son olarak, olaylar gibi ExpandoObject için ekleyebilirsiniz:

class Program
{

   static void Main(string[] args)
   {
       dynamic d = new ExpandoObject();

       // Initialize the event to null (meaning no handlers)
       d.MyEvent = null;

       // Add some handlers
       d.MyEvent  = new EventHandler(OnMyEvent);
       d.MyEvent  = new EventHandler(OnMyEvent2);

       // Fire the event
       EventHandler e = d.MyEvent;

       if (e != null)
       {
           e(d, new EventArgs());
       }

       // We could also fire it with...
       //      d.MyEvent(d, new EventArgs());

       // ...if we knew for sure that the event is non-null.
   }

   static void OnMyEvent(object sender, EventArgs e)
   {
       Console.WriteLine("OnMyEvent fired by: {0}", sender);
   }

   static void OnMyEvent2(object sender, EventArgs e)
   {
       Console.WriteLine("OnMyEvent2 fired by: {0}", sender);
   }
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • backyardjay

    backyardjay

    8 ŞUBAT 2009
  • DeAdPiXel6667

    DeAdPiXel666

    2 Ocak 2010
  • DrePwn

    DrePwn

    22 Temmuz 2011