Benutzerdefinierte Attribute für Klassenmitglieder

8

Ich verwende ein benutzerdefiniertes Attribut, um zu definieren, wie die Mitglieder einer Klasse Eigenschaften zugeordnet werden, die als Formular-Post (Payment Gateway) gebucht werden. Ich habe das benutzerdefinierte Attribut funktioniert gut, und bin in der Lage, das Attribut von "name", aber möchte das Attribut durch das Mitglied selbst erhalten.

Zum Beispiel:

%Vor%

vs

%Vor%

Der Plan besteht darin, eine Methode zum Serialisieren der Klasse mit Elementen in eine buchbare Zeichenfolge zu schreiben.

Hier ist der Testcode, den ich an dieser Stelle habe, wobei ret eine Zeichenfolge und PropertyMapping das benutzerdefinierte Attribut ist:

%Vor%

Vielen Dank im Voraus!

    
ccook 10.03.2009, 14:06
quelle

2 Antworten

9

Sie können dies nicht wirklich tun, es sei denn, Sie verwenden C # 3.0. In diesem Fall müssen Sie sich auf LINQ (äh, Ausdrucksbäume) verlassen.

Sie erstellen eine Dummy-Methode für einen Lambda-Ausdruck, mit dem der Compiler den Ausdrucksbaum erzeugen kann (der Compiler führt die Typprüfung durch). Dann graben Sie in diesen Baum, um das Mitglied zu bekommen. Wie so:

%Vor%

Gegeben die folgende Klasse:

%Vor%

Sie können die Metadaten wie folgt erhalten:

%Vor%

Mit einem Verweis auf dieses Feld können Sie dann jedes Attribut auf die übliche Weise ausgraben. d. Reflexion.

%Vor%

Nun können Sie ein Attribut in irgendeinem Feld durch etwas ausgraben, das vom Compiler in großem Umfang überprüft wird. Es funktioniert auch mit Refactoring, wenn Sie 'a' umbenennen Visual Studio wird das fangen.

%Vor%

Es gibt dort keine einzige literale Zeichenfolge in diesem Code.

    
John Leidegren 10.03.2009, 14:18
quelle
4

Sie können die Hälfte etwas einfacher machen:

%Vor%

btw; Sie sollten es sich zur Gewohnheit machen, Attribute mit dem Wort Attribute zu beenden. Auch wenn dies zu Duplikaten führt (siehe [XmlAttributeAttribute] ).

Wie auch immer - Serialisierung; das ist nicht immer trivial. Eine betrügerische Menge an Code geht in Serialisierungs-Frameworks wie Json.NET usw. ein. Der normale Ansatz könnte sein, einen Typkonverter zu bekommen, aber in vielerlei Hinsicht ist dies mit einem PropertyDescriptor einfacher:

%Vor%     
Marc Gravell 10.03.2009 14:16
quelle