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