head.WriteLine()

Montag, April 03, 2006

AttributeProviderAttribute

Diese kurios klingende Attributklasse ist neu in .NET 2.0 und sehr hilfreich bei der Angabe von Entwurfszeitinformationen. Wenn Sie beispielsweise eine Komponente entwickeln, die datenbindungsfähig sein soll, würden Sie ihr wahrscheinlich eine DataSource-Eigenschaft nach folgendem Strickmuster spendieren:

[Editor(typeof(DataSourceListEditor), typeof(UITypeEditor))]
[TypeConverter(typeof(DataSourceConverter))]
public object DataSource
{
   get { ... }
   set { ... }
}

Die Attribute Editor und TypeConverter teilen hierbei dem PropertyGrid mit, welche UITypeEditor-Klasse, bzw. welche TypeConverter-Klasse zum Anzeigen und Konvertieren der Datenquelle verwendet werden soll. Hierdurch kann im Eigenschaftenfenster die Datenquelle bequem ausgewählt werden.



Mit Hilfe von AttributeProviderAttribute kann diese Deklaration nun drastisch verkürzt werden:

[AttributeProvider(typeof(IListSource))]
public object DataSource
{
   get { ... }
   set { ... }
}

AttributeProvider kann auf Eigenschaftsebene verwendet werden und nimmt ein Type-Objekt entgegen. Das PropertyGrid ermittelt nun die Attribute über den angegebenen Typ und verwendet diese zur Bindung.

Bei einem Blick auf IListSource entdeckt man schließlich wieder die üblichen Verdächtigen UITypeEditor, TypeConverter und co.

[Editor("System.Windows.Forms.Design.DataSourceListEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", "System.Drawing.Design.UITypeEditor, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"),
TypeConverter("System.Windows.Forms.Design.DataSourceConverter, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"),
MergableProperty(false)]
public interface IListSource
{
   IList GetList();
   bool ContainsListCollection { get; }
}

Der Vorteil dieser Variante ist hierbei nicht nur die einfache Verwendung, sondern vor allem die Vorwärtskompatibilität: Ändert sich in einer späteren Version des Frameworks die Entwurfszeitunterstützung beim Data Binding, kann auf Ebene von IListSource einfach ein anderer UITypeEditor bzw. TypeConverter angegeben werden und alle darauf verweisenden Eigenschaften sind automatisch auf dem neusten Stand.

1 Comments:

Kommentar veröffentlichen

<< Home