2016-08-04 23 views
1

ich mehrere Attribute für eine Klasse zu definieren:dynamisch mehrere Instanzen eines Attributs auf eine Eigenschaft anwenden eine Liste mit

[CustomAttribute("a", state = 0)] 
[CustomAttribute("b", state = 0)] 
... 
[CustomAttribute("z", state = 0)] 
public class MyClass { ... } 

Die Werte ("a", "b", auf bis zu "z") werden auch an anderer Stelle im Programm verwendet Jetzt habe ich ein doppeltes Array von Namen.

public static readonly string[] listOfNames = new [] { "a", "b", ..., "z" }; 

ich die Namen von den Attributen wiederherstellen kann Reflexion listOfNames zu bauen verwenden, aber ist es eine Möglichkeit, die Rückseite und definiert die Attribute von listOfNames zu tun? Ich vermute nicht, aber gibt es dann einen klareren Weg, zumindest das CustomAttribute Bit zu vermeiden?

Antwort

1

können Sie TypeDescriptor.AddAttributes verwenden Klasse-Level-Attribute auf einen Typ zur Laufzeit hinzuzufügen:

string[] listOfNames = new [] { "a", "b", "c" }; 
var attributes = listOfNames.Select(x=>new CustomAttribute(x)).ToArray(); 
TypeDescriptor.AddAttributes(typeof(MyClass), attributes); 

auch als eine weitere Option, die Sie eine CustomTypeDescriptor für Ihre Art schaffen. In der benutzerdefinierten Typenbeschreibung geben Sie benutzerdefinierte PropertyDescriptor-Objekte für die Eigenschaften Ihres Typs zurück, und im Eigenschaftsdeskriptor geben Sie einen benutzerdefinierten Satz von Attributen für die Eigenschaft zurück. Der Schlüsselpunkt im Eigenschaftendeskriptor ist das Überschreiben der Eigenschaft Attributes. Erstellen Sie dann eine TypeDescriptionProvider und registrieren Sie sie für Ihren Typ, um die benutzerdefinierte Typbeschreibung bereitzustellen. Auf diese Weise können Sie ein einzelnes Attribut anstelle all dieser Attribute verwenden.

Um eine Implementierung zu sehen, werfen Sie einen Blick auf diesen Beitrag: Combining Control Attributes.

+0

Wahrscheinlich die erste Option, die Sie zufrieden stellend, während es vielleicht genug ist für jetzt, aber behalten Sie die zweite Lösung im Hinterkopf, es kann Ihnen in Zukunft helfen, der verlinkte Beitrag ist wirklich nützlich für Fälle, die Frameworks Standard-Typ Beschreibung Mechanismen verwenden. Zum Beispiel verwenden Windows Forms oder ASP.NET MVC den Mechanismus. –