153 Stimmen

Können Attribute in C# dynamisch hinzugefügt werden?

Ist es möglich, zur Laufzeit Attribute hinzuzufügen oder den Wert eines Attributs zur Laufzeit zu ändern?

0 Stimmen

72voto

Alex Lyman Punkte 15257

Das hängt wirklich davon ab, was genau Sie erreichen wollen.

En System.ComponentModel.TypeDescriptor stuff kann verwendet werden, um Attribute zu Typen, Eigenschaften und Objektinstanzen hinzuzufügen, und es hat die Einschränkung, dass Sie es verwenden müssen, um diese Eigenschaften auch abzurufen. Wenn Sie den Code schreiben, der diese Attribute verbraucht, und Sie mit diesen Einschränkungen leben können, würde ich es auf jeden Fall empfehlen.

Soweit ich weiß, sind das PropertyGrid-Steuerelement und die Visual Studio Design-Oberfläche die einzigen Dinge in der BCL, die TypeDescriptor Zeug verbrauchen. In der Tat, das ist, wie sie etwa die Hälfte der Dinge, die sie wirklich tun müssen, zu tun.

70voto

Mark Cidade Punkte 95914

Attribute sind statische Metadaten. Assemblies, Module, Typen, Member, Parameter und Rückgabewerte sind in C# keine Objekte erster Klasse (z.B. die System.Type Klasse ist lediglich eine reflektierte Darstellung eines Typs). Sie können eine Instanz eines Attributs für einen Typ erhalten und die Eigenschaften ändern, wenn sie beschreibbar sind, aber das wirkt sich nicht auf das Attribut aus, da es auf den Typ angewendet wird.

12voto

petr k. Punkte 7910

Das können Sie nicht. Eine Abhilfe könnte sein, eine abgeleitete Klasse zur Laufzeit zu generieren und das Attribut hinzuzufügen, obwohl dies wahrscheinlich ein bisschen übertrieben ist.

11voto

torial Punkte 13003

Nun, nur um anders zu sein, fand ich einen Artikel, der auf die Verwendung von Reflection.Emit verweist, um dies zu tun.

Hier ist der Link: http://www.codeproject.com/KB/cs/dotnetattributes.aspx Sie sollten auch einige der Kommentare am Ende des Artikels lesen, denn dort werden mögliche Ansätze diskutiert.

4voto

Thomas Danecker Punkte 4500

Nein, das ist es nicht.

Attribute sind Metadaten und werden in der kompilierten Assembly in binärer Form gespeichert (deshalb können Sie auch nur einfache Typen in ihnen verwenden).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X