Feedback

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

Veröffentlicht von am 07.10.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; }
}
GFU-Schulungen  [Anzeige]

C# Grundlagen

Die Schulung vermittelt Ihnen die Grundlagen von C# in der Arbeit mit Datentypen sowie bei Klassenbibliotheken. Sie lernen, mit Variablen umzugehen und deren verschiedene Formen zu konvertieren. 

Visual Studio Team Foundation Server 2017/2015 (TFS) für Projektmitglieder - Kompakt

Nach Teilnahme an dieser Schulung sind Ihnen die Grundlagen von ALM geläufig. Sie planen und steuern Projekte effizient mit dem Visual Studio Team Foundation Server.

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 06.11.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 06.11.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!