2009-11-23 6 views

Antwort

5

Kurzer Hinweis: Dynamische Methodentasche ist eine Methode, um Methoden dynamisch einem Objekt hinzuzufügen. Bill Wagner beschreibt es here mit Quellcode here.


Die einfache Antwort ist, dass die MethodBag Konzept Sie ist eine Technik, gerade zeigt. Sie können das ExpandoObject dazu unbedingt verwenden, aber möglicherweise möchten Sie eine eigene Klasse schreiben, die von System.Dynamic.DynamicObject erbt. Ein Beispiel hierfür könnte darin bestehen, ein dynamisches JSON-, YAML- oder XML-Objekt bereitzustellen, mit dem Sie Ihre Daten in Punkt-Eigenschaften-Notation anstelle der traditionellen String-Arten referenzieren können. Wenn Sie von DynamicObject übernehmen, stellen Sie möglicherweise fest, dass Sie das Hinzufügen dynamischer Funktionen auch für Ihre Klasse zulassen möchten. Die MethodBag-Technik zeigt Ihnen, wie Sie das tun. Das ExpandoObject ist nur ein Beispiel für eine Klasse, die diese Technik implementiert. ExpandoObject ist für 95% von dem, was Sie brauchen, gut und die MethodBag-Technik zeigt Ihnen, wie Sie Ihre eigenen schreiben können, wenn Sie sich dazu entschließen, dies für die letzten 5% zu tun.

7

MethodBags und ähnliche Implementierungen neigen dazu, einige Einschränkungen zu haben. Es ist vielleicht einfacher, eine eigene Klasse zu implementieren, wenn Sie in diese Straßenblockaden geraten. Speziell:

  • Schwer zu implementieren Zustand in einer Methode Tasche. (Ausdrucksbäume können keine statisch typisierten Objekte wie dynamic enthalten; keine gute Syntax zum Erstellen von Methoden, die auf dem internen Status desselben dynamischen Objekts basieren.)

  • Kann nur öffentliche Methoden hinzufügen. Keine virtuellen, privaten, geschützten oder abstrakten Methoden.

  • Eine Schnittstelle kann nicht implementiert werden.

Im Vergleich ExpandoObjects sind wahre Klassen und sind viel reicher und mit vollem Funktionsumfang. Sie ahmen genauer nach, was Sie sonst kostenlos in Ruby oder Python erhalten würden.

+0

Danke. Aber ich denke du hast meine Frage umgekehrt. Ich habe gefragt, warum ich MethodBags verwende, wenn ExpandoObject ist, nicht warum ExpandoObject verwenden soll, wenn ich MethodBags verwenden kann. –

+0

@ stimply77, methodbags sind auf bestimmte Ebene begrenzt, wie John sagte, Sie können nicht verwenden Methodenbasen, wo Sie Schnittstellen und spezifische Typen implementieren möchten. – RameshVel

+0

@ stimpy77: Ich denke, mein Punkt war mehr, dass es nicht viel Grund, es sei denn Sie brauchen absolut nichts außer ein paar Methoden. ExpandoObject scheint die bessere allgemeine Wahl zu sein. –

Verwandte Themen