.NET benutzerdefinierte Eigenschaft Attribut?
BEARBEITEN:
Besser hätte ich anders formulieren:
Wie kann ich eine Verschiebung der GET-Implementierung einer Klasse Eigenschaft auf einen /mit einem benutzerdefinierten Attribut? (Ich habe instantation vars (classname, propertyname), um das Attribut, jedoch habe ich lieber diese automatisch heruntergeladen ofcourse.)
Public Class CustomClass
<CustomAttributeClass(ClassName:="CustomClass", PropertyName = "SomeProperty")> _
Public Property SomeProperty() as String
Get() as String
//This implementation should be handled by the attribute class
End Get
Set(Byval value as String)
Me._someProperty = value
End Set
End Property
End Class
Alte Frage:
Ich möchte erstellen Sie eine benutzerdefinierte Eigenschaft Attribut für Klassen. Ich kann das erstellen einer Klasse, abgeleitet von Attribut und 'mark' ist die Eigenschaft mit dem Attribut, aber wohin von hier aus?
Habe ich ein repository, in dem ich schnell Daten auf der Grundlage der Attribute-Werte. Ich möchte zu verallgemeinern, das Verhalten der Eigenschaft in das Attribut aber ich weiß nicht wie ich von hier aus gehen... Jede Hilfe wäre sehr akzeptiert!
Public Class CustomDataAttribute : Inherits Attribute
Private _name As String
Public Sub New(ByVal name As String)
Me.Name = name
End Sub
Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
Me._name = value
End Set
End Property
End Class
Public Class CustomClass
<CustomDataAttribute(Name:="CustomField")> _
Public Property CustomField()
End Property
End Class
Die CustomClass ist eine Daten-Klasse, die speichert die Daten in der Tabelle, die mit Ihr verbundenen. Ich überschreiben möchten mehrere Eigenschaften und speichern diese in einer separaten Tabelle (zusammen mit anderen Eigenschaften von anderen benutzerdefinierten Klassen, die Notwendigkeit, Daten aus einer eigenen Tabelle)
InformationsquelleAutor Ropstah | 2010-03-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie Reflektion, um zu entdecken, das Attribut. In Ihrem Fall, Sie bekommen es von PropertyInfo.GetCustomAttributes().
Den härteren Teil der Verwendung von Attributen ist zu finden, eine geeignete Ausführung Modell tatsächlich zu nutzen. So etwas wie einen compiler, einen designer oder eine Klasse, die serialisiert Objekte ist ein offensichtlicher. Die Verwendbarkeit von Attributen schnell Spiralen nach unten von dort. Es ist fast immer die falsche Wahl, wenn Sie versuchen, ein Attribut, in dem ein virtuelles Eigentum tatsächlich benötigt wird. Abrufen von Attribut-Werte ist sehr teuer, viele Größenordnungen teurer als das abrufen einer Eigenschaft-Wert. Verwenden Sie Sie nur, wenn die Reflexion-code ausgeführt wird, zu menschlicher Zeit (wie Compiler), oder wenn die Kosten ist unbedeutend im Vergleich zu dem nutzen oder der Aufwand Häufig in jeder Art von I/O-operation).
"sehr" teuer ist nicht ganz richtig. Technisch teurer als eine Methode nennen, ja. Aber-Attribut-orientierte Modelle werden in der gesamten .NET-Welt in Systeme, die sehr empfindlich auf die Leistung. Die Verwendung von Attributen, die in Ihrem system nicht der Flaschenhals.
Aber ich habe keine Ahnung, wohin Sie gehen mit dem Reflektor. Es scheint seltsam zu tun, zu schauen, was ich versuche zu erreichen...... Gibt es nicht ein Basis-property-Attribut, das hat einige events, wie onGet und einsetzen?
Ich habe Schwierigkeiten zu verstehen, Ihre use-case. Lokalisierung ist ein UI-detail, sollte es nicht anwendbar sein, um business-Objekte. Die Lokalisierung ist bereits gut unterstützt .NET-UI-frameworks wie WF, WPF und ASP.NET. Sehen Sie dort zuerst nach.
Ich verstehe nicht, wie kann ich verwenden der Standard-Ressourcen-Anbieter (was ich auch umgesetzt, wie eine SQL-Ressource-Provider) für die lokalisierten Inhalte in business-Klassen (diese lokalisierten Ressourcen müssen verwendet werden, an mehr Orten als nur Ansichten). Oder sollten alle Ressourcen, die nicht spezifisch für eine einzelne view Global-Ressourcen?
InformationsquelleAutor Hans Passant
Aus Ihren Kommentaren zu der vorherigen Antwort, ich denke, Sie werden feststellen, dass .NET-Attribute sind nicht ganz so flexibel, wie Sie sein möchten.
Fragte Sie "gibt es nicht ein Basis-property-Attribut, das hat einige events, wie onGet und dem Ausbruch?" -- Nein; Attribute haben keine built-in Interaktion mit Ihren Zielen, ob Methoden oder Klassen. In der Tat, Sie können nicht einmal sagen, zur Laufzeit, was das Ziel eines Attributs ist; Sie müssen das Ziel kennen (Klasse, Methode, Eigenschaft etc.), und dann erste Abfrage die Attribute schmücken.
Zweitens, Attribute eigentlich nicht erstellt, bis die Abfrage für Sie. Wenn Sie anrufen
GetCustomAttributes
das Laufzeitsystem wertet den Metadaten der assembly und instanziiert, die Attribute, die angegeben wurden. Wenn Sie nennen es zweimal in einer Zeile, erhalten Sie zwei Sätze mit den gleichen Parametern.Gehen zurück zu Ihrer anderen Frage: wenn Sie wissen wollen, wenn Sie eine Immobilie geschmückt mit Ihren Parametern festgelegt oder abgerufen wird, Sie hätten zu implementieren
INotifyPropertyChanged
auf allen Ihren zugehörigen Klassen, code schreiben, suchen Sie alle Ihre Klassen für Eigenschaften, die mit markiert, das Attribut auf assembly laden, und dann bauen einige Interaktivität, hakte sich diePropertyChanged
Veranstaltungen auf, was auch immer code, den Sie brauchen, um zu feuern. (Und dass nur Sie informiert überset
Operationen, nichtget
.)Keine Ahnung, ob das hilfreich ist, aber dort gehen Sie. 🙂
InformationsquelleAutor Ben M
Hier ist eine Klasse, die hilft bei der Verarbeitung von benutzerdefinierten Parametern bei der Verwendung von reflection. Übergeben des Typs als parameter contructor.
InformationsquelleAutor Maksym Kozlenko