PropertyInfo in Attribute


10110010

Mitglied
Hallo,

ich habe ein Attribute gebaut, mit dem ich eine Property an eine Spalte in einer Datenbank Binde.
Dem Attribut kann ich im Konstruktor den Spaltennamen angeben. Jetzt möchte ich aber, dass wenn kein Expliziter Name angegeben wurde, dass dann der PropertyName benutzt werden soll.

Komme ich in dem Attribute irgendwie an die PropertyInfo?

C#:
//Mit Spaltenangabe
[Column("Foo")]
public string Text { get; set; }

//Das Attribbute soll jetzt "Bar" verwenden
[Column()]
public string Bar { get; set; }
 

Spyke

Premium-User
Ist das deine eigene erstellte Attribute Klasse oder das aus System.ComponentModel.DataAnnotation?

Ich kenne das Attribute aus System.ComponentModel.DataAnnotation nicht, aber so wie ichs les, müssten die microsoft eigenen automatismen damit umgehen können.

Wie wertest du das Attribute aus?
 

10110010

Mitglied
Das ist ein eigenes Attribute, dass natürlich von Attribute ableitet.
In einer anderen Klasse übergebe ich einen Typ, in dem ich die Properties mit den Attributen versehen habe und lasse mir alle Attribute geben.
Aus denen verwende ich dann die Eigenschaften um eine SQL-Query zu erstellen.

Ich muss demnach in dem Konstruktor des Attributes die Zugehörige Property Kennen um dessen Namen zu ermitteln und diesen in eine Attribute-Property ab zu legen, damit die dann vorhanden ist.

Der Konstruktor meines Attributes sieht dann etwa so aus:
C#:
public MyAttribute():base()
{
   this.Column = [Property.Name]; // Der Name von der zugehörigen Eigenschaft!
}
public MyAttribute(string column):base()
{
   this.Column = column;
}
 

Spyke

Premium-User
Ich würde an der stelle an der du das Attribute auswertest prüfen ob Column gesetzt ist.

Sprich nicht über das Attribute steuern, sondern dort wo du die Query auswerten/erstellen willst.
Dort müsstest du ja PropertyDescriptor, PropertyInfo oder der gleichen zur Verfügung haben aus dem du den Namen ziehen kannst.
 

10110010

Mitglied
So mach ich es im Moment, aber cooler währe es, wenn ich das nicht müsste.

Was ich bisher gefunden habe ist das hier:
C#:
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName=null)
{
    var del = PropertyChanged;
    if (del != null)
    {
        del(this, new PropertyChangedEventArgs(propertyName));
    }
}

Aber das geht nicht mit Attributen.
 

Spyke

Premium-User
Anders wirst du nicht drum herum kommen.
Attribute wissen nixs von der Eigenschaft wo sie hängen.

Die werden sogar meines wissens statisch gehalten, aber da bin ich mir gerade nicht ganz sicher.