2010-12-02 7 views
1

Lassen Sie sagen, ich habe folgendes:C# - Alternative Art und Weise zu verwenden Attribut

public class A { 
    [MyAttribute] 
    public void Test() {} 
} 

Ich mag es nicht, das Verhalten ein Attribut des Hinzufügens eines Verfahrens oder eine Klasse mit [], um das Präfix. Ich denke, das macht den Code weniger lesbar.

Ich finde, dass ein besserer Ansatz so etwas wie sein:

AddAttribute(A, Test, MyAttribute); 

Gibt es eine Möglichkeit so etwas zu tun?

Denn das ist eine Art von Attribute zur Laufzeit des Hinzufügen ...

Oder gibt es andere Weise Attribute zu benutzen? Wie XML-Dateien?

+4

Ich muss auf das Lesbarkeit Argument widersprechen. Ihre Add() - Anweisungen könnten weit entfernt sein und leicht übersehen werden. –

+1

Lassen Sie sich beispielsweise diese Klasse anzeigen: http: //weblogs.asp.net/blogs/scottgu/image_46680F68.png. Ich finde den Code nicht wirklich lesbar. Es muss einen saubereren Weg geben, dies zu tun. So etwas wie FluentValidation. Aber etwas eingebautes. Nichts, was diese Attribute emuliert ... – Melursus

+0

Diese Klasse scheint ziemlich gut lesbar zu sein. Finden Sie ehrlich, dass das Ersetzen der Attribute durch Methoden, die wie Methodenaufrufe aussehen, lesbarer wird? Stellt das Einfügen von etwas, das wie Methodenaufrufe aussieht, nicht gut aus, wie Methodenaufrufe? –

Antwort

5

Attribute können zur Laufzeit nicht hinzugefügt werden, sie sind in die Metadaten der Assembly eingebettet. Sie können jedoch Attribute hinzufügen, indem Sie während der Erstellung ein externes Tool verwenden, das Ihren Quellcode vor dem Kompilieren ändert.

1

Nein, es gibt keine generische Lösung zum Ersetzen von Attributen.

Es gibt jedoch andere Möglichkeiten zum Implementieren von Objekten, die von Attributen bereitgestellt werden. Es hängt wirklich von dem Rahmen ab, den Sie verwenden.

0

Es hängt vom Kontext ab; für einige Szenarien, Attribute tatsächlich können zur Laufzeit hinzugefügt werden - aber sie zeigen nur unter TypeDescriptor (was ist, was die meisten UI-Datenbindung verwendet), und nicht rohe Reflexion.

Zum Beispiel für einen mit Anmerkungen versehen Typ:

TypeDescriptor.AddAttributes(typeof(Foo), 
    new TypeConverterAttribute(typeof(ExpandableObjectConverter))); 

den Typ-Konverter für einen Typen zur Laufzeit zu ersetzen.

Sie können auch einige Tricks mit Eigenschaften, aber es ist eine Menge Modus ... fiddly.

Für den allgemeinen Fall; Verwenden Sie nur Code-Attribute. Es gibt nichts inhärent unlesbar in Bezug auf Attribute, und ihre Position dient dazu, zu betonen, dass sie Metadaten - über der Typ/Methode sind, aber nicht wirklich Teil des Typs/Methode selbst.


Das Folgende ist nur zur Diskussion; Ich würde dies nicht nur tun, weil Sie nicht den Blick von ihm gefällt (obwohl ich so etwas getan haben annotate Maschine generierten Code helfen):

Datei 1

[Description("evil evil evil")] 
partial class Foo { 
    [Description("don't do this")] 
    partial void Bar(); 
} 

Datei 2

partial class Foo { 
    partial void Bar() { 
     Console.WriteLine("I can only be called from inside the type; " 
      + "I can't be public"); 
    } 
} 
Verwandte Themen