Feedback

C# - Standardwerte für automatische Eigenschaften in .net 3.x

Veröffentlicht von am 10/7/2008
(4 Bewertungen)
Die Einführung von automatischen Eigenschaften hat den großen Vorteil dass weniger Tipparbeit nötig ist.

Ein wesentlicher Nachteil ist dass keine Standardwerte gesetzt werden können.

Nachfolgend beschrieben ist eine Klasse die es ermöglich Standardwerte per Attribut zu setzten.

Verwendungsbeispiel:
public class MyClass : AutomaticProperties
{
[DefaultValue(true)]
public bool boolWert { get; set; }

[DefaultValue(666)]
public int intWert { get; set; }

[DefaultValue("Günther")]
public string stringWert { get; set; }
}
using System.ComponentModel;
using System.Reflection;

namespace gfoidl.Tools
{
	public class AutomaticProperties
	{
		/// <summary>
		/// Weist die Standardwerte den Eigenschaften zu.
		/// </summary>
		/// <param name="o">
		/// Die Klasse bzw. die Instanz davon dessen Eigenschaften
		/// gesetzt werden soll
		/// </param>
		public virtual void InitDefaults(object o)
		{
			// Alle Eigenschaften holen:
			PropertyInfo[] propteryInfos =
				o.GetType().GetProperties(
					BindingFlags.Public |
					BindingFlags.NonPublic |
					BindingFlags.Instance |
					BindingFlags.Static);

			// Alle Eigenschaften durchlaufen:
			foreach (PropertyInfo pi in propteryInfos)
			{
				// Nur wenn ein Attribut gesetzt ist:
				if (pi.GetCustomAttributes(true).Length > 0)
				{
					// Attribute holen:
					object[] attributes =
						pi.GetCustomAttributes(
							typeof(DefaultValueAttribute),
							true);

					if (attributes != null)
					{
						// Das 1. Attribut holen:
						DefaultValueAttribute dva =
							attributes[0] as DefaultValueAttribute;

						if (dva != null)
							pi.SetValue(o, dva.Value, null);
					}
				}
			}
		}
		//---------------------------------------------------------------------
		/// <summary>
		/// Der Konstruktor wird immer als ersters aufgerufen wenn von dieser
		/// Klasse abgeleitet wird!
		/// </summary>
		public AutomaticProperties()
		{
			InitDefaults(this);
		}
	}
}

2 Kommentare zum Snippet

Rainer Hilmer schrieb am 11/6/2008:
Du schreibst eine Attribut-Klasse ohne daß diese von Attribute erbt. Ich wußte gar nicht daß das möglich ist. Hammer! 10 Punkte dafür.
Günther Foidl schrieb am 11/6/2008:
Ich auch nicht ;)

Das DefaultValue-Attribut wird ist vom Namespace System.ComponentModel und eigentlich für Steuerelemente gedacht. Es hindert aber nichts daran dieses Attribut auch anderswertig (wie hier) zu verwendet. Deshalb ist ein erben von Attribut nicht nötig.
 

Logge dich ein, um hier zu kommentieren!