2009-02-19 10 views

Antwort

2

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.

+0

Und nach Klasse, er bedeutet eine ganz neue Art, nicht nur eine andere Instanz der gleichen Klasse. –

+0

@Joel ganz richtig, ich kann sehen, es könnte ein bisschen mehrdeutig sein. Danke –

1

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.

+0

s/interpretiert/dynamisch /. Ruby, PHP und Python sind dynamisch. C#, Java und VB sind statisch. – strager

+0

@bill Ich denke du meinst dynamische Sprache ... –

+0

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 ... –

0

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.

9

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"); 
Verwandte Themen