Als eine Entitätsklasse möchte ich zur Laufzeit eine Attribute hinzufügen, wie soll ich tun?C#: Wie fügt man einem Objekt zur Laufzeit ein Attribut hinzu?
Antwort
Edit: bitte klären Sie, sprechen Sie über c# attributes oder Mitglieder in Ihrer Klasse?
Die einzige Möglichkeit zum Hinzufügen von C# -Attributen besteht darin, eine vollständig neue Klasse mit den zusätzlichen Attributen zu erstellen, die neue Assembly zu kompilieren und in Ihre vorhandene Anwendungsdomäne zu laden.
Verwenden Sie eine Hashtabelle, um Ihre Attribute zu speichern.
Wenn Sie mehr Laufzeitflexibilität wünschen, können Sie Ruby oder eine andere interpretierte Sprache ausprobieren.
s/interpretiert/dynamisch /. Ruby, PHP und Python sind dynamisch. C#, Java und VB sind statisch. – strager
@bill Ich denke du meinst dynamische Sprache ... –
Sicher - guter Punkt. Jede Sprache kann kompiliert werden und jede Sprache kann interpretiert werden. Nur ein merkwürdiger Zufall, dass Ruby, PHP und Python allgemein interpretiert werden und C#, Java und VB kompiliert werden ... –
Attribute sind Teil der Metadaten eines Typs und daher in der kompilierten Assembly fest codiert (deshalb dürfen Sie auch nur einige primitive Typen und keine beliebigen Daten bei Attributen verwenden).
Die Konsequenz ist, dass Sie zur Laufzeit keine Attribute zu einem Typ hinzufügen können. Aber es gibt verschiedene alternative Techniken. Sie könnten einfache Wörterbücher oder etwas stärkeres wie attached dependency properties verwenden.
Schauen Sie sich die Dynamic Language Runtime an. Sie können auch eine dynamische Sprache wie IronRuby oder IronPython betrachten.
Welche problam versuchen Sie zu lösen?
Was braucht die Attribute zu sehen? Wenn es Dinge wie Datenbindung usw., soll TypeDescriptor
arbeiten:
TypeDescriptor.AddAttributes(type, attribs);
TypeDescriptor.AddAttributes(instance, attribs);
Dies betrifft nur System.ComponentModel
Nutzung (nicht direkte Reflexion), aber das ist oft genug - zum Beispiel, können Sie ein TypeConverter
über die oben in Verbindung bringen.
Wenn Sie unter "Attribute" "Eigenschaften" verstehen, dann hat (wiederum, soweit es die Datenbindung betrifft) auch TypeDescriptor
Potenzial - aber es ist nicht trivial; Sie müssen entweder ICustomTypeDescriptor
für das Objekt implementieren oder eine CustomTypeDescriptor
für den Typ schreiben - und in jedem Fall müssen Sie Ihre eigene PropertyDescriptor
Implementierung schreiben (oft mit einem Instanzwörterbuch usw. sprechen). Dies wird von allem verwendet, das verwendet:
// only works if you use TypeDescriptionProvider
PropertyDescriptorCollection typeProps = TypeDescriptor.GetProperties(type);
// works via TypeDescriptionProvider or ICustomTypeDescriptor
PropertyDescriptorCollection objProps = TypeDescriptor.GetProperties(obj);
Auch dies deckt eine breite Palette von Datenbindungen und ähnlichen Szenarien. Ein Beispiel dafür ist see here - es ist jedoch alles andere als trivial. Das Beispiel für die Verwendung (von Link) fügt zwei Eigenschaften zur Laufzeit:
Bag.AddProperty<int>("TestProp", new DefaultValueAttribute(5));
Bag.AddProperty<string>("Name");
ich mit PostSharp, eine sehr eleganten AOP framework (oder Politik Injection) gehen würde.
PostSharp allows you to inject custom attributes.
Der Blog-Eintrag, auf den in der Post verwiesen wird, enthält Code, den Sie herunterladen können, um Ihr Ziel zu erreichen.
Dieser Beitrag beantwortet das für mich:
- 1. C# Wie fügt man contextMenuStrip zur Laufzeit hinzu?
- 2. Wie fügt man einem serialisierten XML-Knoten ein Attribut hinzu?
- 3. Wie fügt man einem Element mit jquery ein Attribut hinzu?
- 4. Wie fügt man ein "readonly" Attribut zu einem hinzu?
- 5. Wie fügt man Einträge in Application.conf zur Laufzeit hinzu?
- 6. Wie fügt man dem Nokogiri Knoten ein Attribut hinzu?
- 7. Wie fügt man zur Laufzeit ein Benutzersteuerelement zu einem Fenster hinzu?
- 8. Wie definiert man ein C# -Objekt zur Laufzeit?
- 9. Wie fügt man jedem Objekt in einem Array ein Attribut hinzu?
- 10. Wie fügt man Eigenschaften zum Objekt zur Laufzeit in .net hinzu?
- 11. Wie fügt man Zeichenketten zur Textdatei hinzu?
- 12. Wie fügt man InputMethodService zur Aktivität hinzu?
- 13. Wie fügt man der tabellierten Registerkartensteuerung zur Laufzeit ein wpf-Steuerelement hinzu?
- 14. Wie fügen Sie einem FormData() - Objekt ein Enctype-Attribut hinzu?
- 15. Wie fügt man ein Bildsymbol zu einem Bestätigungsdialogfeld hinzu?
- 16. Wie fügt man einem GUI ein "Konsolen" ähnliches Fenster hinzu?
- 17. Wie fügt man einem NSDate ein Zeitintervall hinzu?
- 18. Wie fügt man einem UITextView Zeilennummern hinzu?
- 19. Obj C: Wie fügt man einem Blockobjekt eine Beschreibung hinzu?
- 20. Wie fügt man zur Laufzeit in .NET den Ordner zum Assembly-Suchpfad hinzu?
- 21. Wie fügt man einem ListView ein FrameLayout hinzu?
- 22. Wie fügt man ein Sternchen in einem mathematischen Ausdruck hinzu?
- 23. Wie fügt man dem text_field_tag das Attribut data-stripe hinzu?
- 24. Wie fügt man einem Modell in Ruby on Rails ein virtuelles Attribut hinzu?
- 25. rapid miner: Wie fügt man einem Datensatz ein Attribut 'label' hinzu?
- 26. Wie fügt man Namespace zur Razor View Engine hinzu?
- 27. insertObject fügt kein Objekt hinzu?
- 28. Wie fügt man dem Grails-Domänenobjekt dynamische Methoden zur Laufzeit hinzu, ohne Plugins zu erstellen?
- 29. Wie fügt man dem ClassPath zur Laufzeit dynamisch eine externe jar-Datei hinzu?
- 30. Ember-Router: Wie fügt man eine Route zur Laufzeit in Ember 1.0-rc2 hinzu?
Und nach Klasse, er bedeutet eine ganz neue Art, nicht nur eine andere Instanz der gleichen Klasse. –
@Joel ganz richtig, ich kann sehen, es könnte ein bisschen mehrdeutig sein. Danke –