2009-09-08 13 views
5

Welche Auswirkungen hat das Hinzufügen von Methoden und Eigenschaften zur Laufzeit unter Verwendung dynamischer Features, wie in this blog post beschrieben?Eigenschaften und Methoden zur Laufzeit in C# 4.0 anhängen?

Was sind die praktischen Einsatzmöglichkeiten von ExpandoObject?

+0

möglich Duplikat von [ Was sind die wahren Vorteile von ExpandoObject?] (Http://stackoverflow.com/questions/1653046/what-are-the-true-benefits-of-expandoobject) – nawfal

Antwort

10

Nun, Sie sind nicht wirklich Anfügen von Methoden und Eigenschaften an das Objekt. Nicht soweit es die CLR betrifft. Sie fügen nur Einträge in ein Wörterbuch ein, und wenn die ExpandoObject Implementierung von IDynamicMetaObjectProvider nach dem Eigenschaftswert gefragt wird (oder gefragt wird, ob die Methode ausgeführt werden soll), wird sie entsprechend ausgeführt.

Leistung ist offensichtlich langsamer als statisch gebundener Zugriff auf Methoden/Eigenschaften, aber die DLR ist ziemlich nippy. Meine persönliche Sorge ist nicht die Leistung, sondern die mangelnde Typensicherheit - ein Tippfehler kann leicht den Code aufschrauben, ohne dass der Compiler ihn bemerkt.

Mein persönlicher Rat ist, nur dynamisches Tippen in C# 4 zu verwenden, wo es einen sehr klaren Vorteil gibt ... den ich erwarte relativ selten (wie unsicheren Code).

Verwendet für ExpandoObject? Nicht so viele, IMO - vor allem im Gespräch mit anderen dynamischen Sprachen.

+0

Whoa, das fängt an, wie Prototyp-basierte Programmierung aussehen. Könnte es außerdem dazu verwendet werden, die Basisklasseninjektion [per Assembly] nachzubilden? –

+3

Relativ selten ?! Sie Sir, sind kein Ruby-Programmierer :) –

+3

@Paul: In der Tat ... weil wir über C# reden, anstatt Ruby. Als grundsätzlich statisch typisierte Sprache glaube ich, dass es relativ selten sein wird, C# zu einem Mischmasch aus statischer und dynamischer Typisierung zu machen. Wenn Sie dynamische Typisierung ausgiebig verwenden möchten, verwenden Sie IronRuby oder IronPython ... –

2

ExpandoObject bezieht sich auf die DLR, und ist in erster Linie für das Spielen zwischen C# und einer dynamischen Sprache verwandt (vielleicht IronPython); Im Allgemeinen kann diese Art von Property-Bag-Objekt jedoch nützlich sein, wenn das Schema Ihrer Typen nur zur Laufzeit bekannt ist und möglicherweise auf Datenbankdaten/Konfigurationsdaten basiert. Vielleicht ein Beispiel für die "innere Plattform" Anti-Pattern, aber es ist nützlich in bestimmten Szenarien, um Eigenschaften zur Laufzeit anzuhängen. Natürlich, für rein CLR Nutzung (dh keine DLR Anrufer) Sie viel mehr einfach mit einem Indexer und Wörterbuch kann dies nur tun:

obj["Name"] = "Fred"; 
string name = (string) obj["Name"]; 

Für Datenbindungszwecke, auch mit diesem können Sie die vollständigen Daten erreichen verbindlich Verwenden benutzerdefinierter Eigenschaftsdeskriptoren über ICustomTypeDescriptor oder TypeDescriptionProvider.

Oder für ein einfaches Beispiel: betrachten DataTable ... ist das teil, was Sie hier tun können (auch hier in statisch typisierte Code): (ungetestet Beispiel)

DataTable table = new DataTable(); 
table.Columns.Add("Name", typeof(string)); 
DataRow row = table.Rows.Add("Fred"); 
Verwandte Themen