2009-08-01 12 views
37

Ich habe eine anonyme Klasse:Kann ich Attribute mit anonymen Klassen verwenden?

var someAnonymousClass = new 
{ 
    SomeInt = 25, 
    SomeString = "Hello anonymous Classes!", 
    SomeDate = DateTime.Now 
}; 

Gibt es trotzdem Attribute dieser Klasse zu befestigen? Reflexion, andere? Ich habe wirklich auf etwas wie dieses gehofft:

var someAnonymousClass = new 
{ 
    [MyAttribute()] 
    SomeInt = 25, 
    SomeString = "Hello anonymous Classes!", 
    SomeDate = DateTime.Now 
}; 

Antwort

45

Sie erstellen hier eigentlich einen anonymen Typ, keinen dynamischen.

Leider gibt es keine Möglichkeit zu erreichen, was Sie versuchen zu tun. Anonyme Typen sollen ein sehr einfacher unveränderlicher Typ sein, der aus Name/Wert-Paaren besteht.

Die C# -Version des anonymen Typs ermöglicht Ihnen nur das Anpassen der Gruppe von Name/Wert-Paaren auf dem zugrunde liegenden Typ. Nichts anderes. VB.Net ermöglicht etwas mehr Anpassung, da die Paare veränderbar oder unveränderbar sein können. Sie können den Typ jedoch nicht mit Attributen erweitern.

Wenn Sie Attribute hinzufügen möchten, müssen Sie einen vollständigen Typ erstellen.

BEARBEITEN OP fragte, ob die Attribute über Reflektion hinzugefügt werden könnten.

Nein, das ist nicht möglich. Reflection ist eine Möglichkeit, Metadaten zu überprüfen, ohne sie zu mutieren. Daher kann es nicht zum Hinzufügen von Attributen verwendet werden.

Darüber hinaus Typdefinitionen in einer Assembly und im Allgemeinen sind unveränderlich und können nicht zur Laufzeit [1] mutiert werden. Dies beinhaltet das Hinzufügen von Attributen zu einer Methode. Andere reflektionsähnliche Technologien können daher auch hier nicht verwendet werden.

[1] Die einzige Ausnahme ist ENC Betrieb

9

Zunächst einmal ist dies ein anonymer Typ. Das Wort "dynamisch" könnte dazu führen, dass Leute denken, dass Sie über eine C# 4.0-Klasse sprechen, die dynamische Semantik implementiert, was Sie nicht sind.

Zweitens, nein, Sie können nicht tun, was Sie fragen.

Wenn Sie Attribute für Ihre Eigenschaften angeben müssen, sind Sie wieder bei einem benannten Typ, dh. eine normale Klasse oder Struktur.

+0

Sie haben recht, ich meinte Anon Typ, danke für die Klarstellung. – will

7

Es ist möglich, Attribute zu einer anonymen Instanz hinzufügen TypeDescriptor.AddAttributes verwenden. Sie können dann später mit TypeDescriptor.GetAttributes auf die Attribute zugreifen.

Dadurch werden sie nicht zur Typ Instanz für das Objekt hinzugefügt. Daher ist es in Ihrem Fall möglicherweise nicht sinnvoll, wenn Sie den Code, der die Attribute abruft und anwendet, nicht kontrollieren.

+0

Beachten Sie, dass Attribute auf Klassenebene hinzugefügt werden, Attribute NOT, die im Beispiel in der Frage erwähnt werden. – DeepSpace101

Verwandte Themen