TOC

This article has been localized into Czech by the community.

Datové typy:

ExpandoObject

Jak jsme viděli v předchozím článku, můžeme použít klíčové slovo dynamic k držení objektu, kde si můžeme definovat vlastnosti, aniž bychom museli nejprve definovat třídu. To, co s dynamickým objektem nemůžeme dělat, je dynamicky přidávat k němu vlastnosti po jeho inicializaci. Pokud potřebujete tuto konkrétní schopnost, C# pro vás má řešení: ExpandoObject. Pojďme se rovnou podívat na příklad, abyste viděli, jak je jeho použití jednoduché:

dynamic user = new System.Dynamic.ExpandoObject();
user.Name = "John Doe";
user.Age = 42;
user.HomeTown = "New York";
Console.WriteLine(user.Name + " is " + user.Age + " years old and lives in " + user.HomeTown);

Všimnete si, že objekt deklaruji s dynamickým typem, i když vytvářím instanci ExpandoObject. Důvodem je, že pokud by objekt byl deklarován jako ExpandoObject, kompilátor by jej kontroloval a okamžitě by si stěžoval na absenci vlastností, které pro něj vymyslíme (Name, Age a tak dále). Toto můžeme zabránit tím, že jej deklarujeme jako dynamic, což, jak jsme se dozvěděli v předchozím článku, zabrání kompilátoru v kontrole existence vlastností, které používáme.

Skvělá věc je, že ExpandoObject může samozřejmě mít vlastnosti, které jsou také ExpandoObject, což vám umožňuje vytvářet složité typy na počkání, jako v tomto příkladu:

dynamic user = new System.Dynamic.ExpandoObject();
user.Name = "John Doe";
user.Age = 42;

user.HomeTown = new System.Dynamic.ExpandoObject();
user.HomeTown.Name = "New York";
user.HomeTown.ZipCode = 10001;

Console.WriteLine(user.Name + " is " + user.Age + " years old and lives in " + user.HomeTown.Name + " [" + user.HomeTown.ZipCode + "]");

Jednoduše změním vlastnost HomeTown z řetězce na ExpandoObject a poté k němu přidám vlastnosti, v tomto případě název a PSČ města. Ale nemusí to končit jen u toho - můžeme k objektu přidat dokonce i metody, opět na počkání, pomocí několika docela sofistikovaných triků:

user.DescribeUser = (Func<String>)(() => {
return user.Name + " is " + user.Age + " years old and lives in " + user.HomeTown.Name + " [" + user.HomeTown.ZipCode + "]";
});

Console.WriteLine(user.DescribeUser());

Docela pěkné věci, ale co vlastně ExpandoObject je? Implementuje několik zajímavých rozhraní, ale jedno z nich je IDictionary<string, object> - to znamená, že pod veškerým syntaktickým sladidlem je váš ExpandoObject v podstatě jen slovník, který drží objektové hodnoty na základě řetězcových klíčů. To také znamená, že iterace přes ExpandoObject je stejně snadná jako iterace přes běžný Dictionary. To je velmi praktické:

dynamic user = new System.Dynamic.ExpandoObject();  
user.Name = "John Doe";  
user.Age = 42;  

foreach (KeyValuePair<string, object> kvp in user)
{
    Console.WriteLine(kvp.Key + ": " + kvp.Value);
}

Shrnutí

Typ ExpandoObject umožňuje definovat objekty na počkání a poté k nim kdykoliv přidávat vlastnosti. Jelikož je v podstatě dynamický typ, zdědí stejné výhody a nevýhody, o kterých jsme diskutovali v předchozím článku. Jako bonus navíc ExpandoObject implementuje rozhraní INotifyPropertyChanged, které určitě oceníte, pokud používáte například WPF pro vaši aplikaci.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!