Beschreibung:
Diese Attribute-Klasse holt von einer vorhandenen Klasse und Eigenschaft die Beschreibung und stellt sie einer neuen Beschreibung (z.B. in einem eigenen UserControl) zur Verfügung.
Verwendung
In meiner DataGridView MaskedTextBoxColumn benutze ich anstelle des Description-Attributs das ReferencedDescription-Attribut und hole für die Mask-Eigenschaft den Text, den NET für die MaskedTextBox vorgemerkt hat:
[ReferencedDescription(typeof(System.Windows.Forms.MaskedTextBox), "Mask")]
Definition
Zunächst werden alle Eigenschaften des referenzierten Typs geholt. Wenn die gewünschte Eigenschaft wirklich vorhanden ist, werden alle deren Attribute gelesen; das DescriptionAttribute wird registriert.
using System.ComponentModel;
#region Referenced Description Attribute
public class ReferencedDescriptionAttribute : DescriptionAttribute
{
public ReferencedDescriptionAttribute(Type referencedType, string propertyName)
{
string result = "Referenced description not available";
// gets the properties of the referenced type
PropertyDescriptorCollection properties
= TypeDescriptor.GetProperties(referencedType);
if (properties != null) {
// gets a PropertyDescriptor to the specific property.
PropertyDescriptor property = properties[propertyName];
if (property != null) {
// gets the attributes of the required property
AttributeCollection attributes = property.Attributes;
// Gets the description attribute from the collection.
DescriptionAttribute descript
= (DescriptionAttribute)attributes[typeof(DescriptionAttribute)];
// register the referenced description
if (!String.IsNullOrEmpty(descript.Description))
result = descript.Description;
}
}
DescriptionValue = result;
}
}
#endregion
Schlagwörter: DescriptionAttribute Description Attribute
Kleine Änderung in der letzten Zuweisung (das habe ich direkt im Code erledigt): Die "vorhandene" Description wird nur dann übernommen, wenn sie nicht leer ist.
Begründung: Die "übliche" Prüfung, ob dieses Attribut vorhanden ist "!= null", kann entfallen, weil im Falle eines Falles ein Standardwert des Attributs (nämlich ein leerer String) immer übergeben wird; eine NullReferenceException kann es deshalb hier nicht geben. Ich möchte aber den Standardtext "not available" nur dann überschreiben, wenn wirklich eine Beschreibung gefunden wurde.
Jürgen
Hallo juetho,
m.E. kann und sollte der leere private Konstruktor entfallen. Er wird in der Klasse nicht benutzt und außerhalb der Klasse kann er nicht benutzt werden. Letzteres wäre aber ebenfalls so, wenn er nicht vorhanden wäre.
herbivore