Ich verstehe nicht, warum dynamische MethodBags verwenden, wenn ich ExpandoObject verwenden kann? Was fehlt mir hier?C# 4.0: Warum MethodBag, wenn ExpandoObject vorhanden ist?
Antwort
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.
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.
- 1. Standardeingabe C: Falsche Zeichenfolge, wenn $ vorhanden ist
- 2. java äquivalent zu C# ExpandoObject
- 3. Warum funktioniert ExpandoObject nicht wie erwartet?
- 4. ExpandoObject als Parameter
- 5. Chefvorlage Wenn Attribut vorhanden ist
- 6. skip_before_filter wenn api_key vorhanden ist
- 7. Rekursives Mappen von ExpandoObject
- 8. Wie ein vorhandenes Objekt in C# 4.0 mit Dynamics
- 9. C# 4.0 Dynamisch vs Expando ... wo passen sie?
- 10. Parameterwert erhalten, wenn Parameterannotation vorhanden ist
- 11. Ist dieses erwartete C# 4.0 Tuple-Gleichheitsverhalten?
- 12. Warum wird dieser C# -Code ordnungsgemäß kompiliert, wenn eine mehrdeutige virtuelle Methode vorhanden ist?
- 13. Arbeitsblatt löschen, wenn Code vorhanden ist
- 14. Reflektieren auf einem ExpandoObject
- 15. Serialisierung von ExpandoObject mit ServiceStack.Text
- 16. ExpandoObject Convenience Factory?
- 17. Eigenschaften und Methoden zur Laufzeit in C# 4.0 anhängen?
- 18. Was ist der Sinn von GLSL, wenn OpenCL vorhanden ist?
- 19. Testing wenn Eigenschaft vorhanden
- 20. Excel - unteren Rand, wenn Text vorhanden ist?
- 21. Return Knoten, wenn Beziehung nicht vorhanden ist
- 22. Etwas tun, wenn Wert vorhanden ist
- 23. MySQL: Einfügen, wenn Fremdschlüssel vorhanden ist
- 24. XSLT wenn Attribut vorhanden ist/else
- 25. Fokus beibehalten, wenn Text vorhanden ist
- 26. Ausweichverhalten, wenn keine XSLT-Erweiterungsfunktion vorhanden ist
- 27. Link nur anzeigen, wenn Assoziation vorhanden ist?
- 28. Spaltenanzahl stapeln, wenn kein Inhalt vorhanden ist
- 29. Tensorflow-Variablenbereich: Wiederverwendung, wenn Variable vorhanden ist
- 30. wenn Schlüssel vorhanden ist: update, sonst: Assoc
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. –
@ 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
@ 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. –