Was mir nicht ganz klar ist, warum Du die Helperklasse noch benutzt, reicht nicht auch folgendes aus:
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Text.RegularExpressions;
using PostSharp.Laos; // PS
//*****************************************************************************
// Hilfsklasse
[Serializable]
[AttributeUsage(AttributeTargets.Property)]
public class MaxStringLengthAttribute : OnMethodBoundaryAspect
{
//--------------------------------------------------------------------------
private int _iMaxStringLength;
//==========================================================================
public MaxStringLengthAttribute()
{
//Helper.SayHuhu();
_iMaxStringLength = -1;
}
//==========================================================================
public MaxStringLengthAttribute(int iMaxStringLength)
{
//Helper.SayHuhu(e);
_iMaxStringLength = iMaxStringLength;
}
//==========================================================================
public override void OnEntry(MethodExecutionEventArgs e)
{
// besser Debug.WriteLine
Console.WriteLine ("==> "
+ e.Method.DeclaringType.Name
+ "."
+ e.Method.Name);
//-----------------------------------------------------------------------
// Argumente holen
//-----------------------------------------------------------------------
Object[] aobjArgs = e.GetArguments();
if (aobjArgs == null)
{
Console.WriteLine("getter called");
return;
}
String strValue = (String)aobjArgs[0];
//-----------------------------------------------------------------------
// Nötigenfalls Ermitteln der Feldlänge
//-----------------------------------------------------------------------
if (_iMaxStringLength < 0)
{
// besser Debug.WriteLine
Console.WriteLine("Simulierter Datenbankzugriff, "
+ "um die Feldlänge zu ermitteln");
if (e.Method.Name.Substring(4) == "Street")
{
// besser Debug.WriteLine
Console.WriteLine("Simulierter Datenbankzugriff erfolgreich");
_iMaxStringLength = 20;
}
}
//-----------------------------------------------------------------------
// Eigentliche Prüfung
//-----------------------------------------------------------------------
if (strValue.Length > _iMaxStringLength)
{
throw new Exception("MaxStringLengthException: "
+ e.Method.DeclaringType.Name
+ "."
+ e.Method.Name.Substring(4)
+ @": """
+ strValue
+ @""" ist "
+ strValue.Length
+ " Zeichen lang. Erlaubt sind aber nur "
+ _iMaxStringLength
+ " Zeichen.");
}
}
}
//*****************************************************************************
// Hilfsklasse
[Serializable]
[AttributeUsage(AttributeTargets.Property)]
public class StringFormatAttribute : OnMethodBoundaryAspect
{
//--------------------------------------------------------------------------
private String _strPattern;
//==========================================================================
public StringFormatAttribute(String strPattern)
{
//Helper.SayHuhu();
_strPattern = strPattern;
}
//==========================================================================
public override void OnEntry(MethodExecutionEventArgs e)
{
Console.WriteLine("==> "
+ e.Method.DeclaringType.Name
+ "."
+ e.Method.Name);
//-----------------------------------------------------------------------
// Argumente holen
//-----------------------------------------------------------------------
Object[] aobjArgs = e.GetArguments();
if (aobjArgs == null)
{
Console.WriteLine("getter called");
return;
}
String strValue = (String)aobjArgs[0];
//-----------------------------------------------------------------------
// Eigentliche Prüfung
//-----------------------------------------------------------------------
if (!Regex.IsMatch(strValue, "^" + _strPattern + "$"))
{
throw new Exception("StringFormatException: "
+ e.Method.DeclaringType.Name
+ "."
+ e.Method.Name.Substring(4)
+ @": """
+ strValue
+ @""" entsprich nicht dem Muster ""^"
+ _strPattern
+ @"$"".");
}
}
}
//*****************************************************************************
// Modellklasse
public class Address
{
//--------------------------------------------------------------------------
private String _strStreet;
//==========================================================================
public Address()
{
//Helper.SayHuhu();
}
//==========================================================================
[MaxStringLength()]
[StringFormat("[a-zA-ZäöüÄÖÜß ]*")]
public String Street
{
get
{
//Helper.SayHuhu();
return _strStreet;
}
set
{
//Helper.SayHuhu();
_strStreet = value;
}
}
}
//*****************************************************************************
// Hauptklasse
static class App
{
//==========================================================================
public static void Main(string[] astrArg)
{
//Helper.SayHuhu();
//-----------------------------------------------------------------------
Address addr = new Address();
//-----------------------------------------------------------------------
Console.WriteLine("");
Console.WriteLine("Setze korrekten Straßennamen");
try
{
addr.Street = "Kurz genug";
}
catch (Exception exc)
{
Console.WriteLine(exc.Message);
}
//-----------------------------------------------------------------------
Console.WriteLine("");
Console.WriteLine("Setze zu langen Straßennamen");
try
{
addr.Street = "Dieser Straßenname ist zu lang";
}
catch (Exception exc)
{
Console.WriteLine(exc.Message);
}
//-----------------------------------------------------------------------
Console.WriteLine("");
Console.WriteLine("Setze Straßennamen mit ungültigen Zeichen");
try
{
addr.Street = "!õ$%&/(";
}
catch (Exception exc)
{
Console.WriteLine(exc.Message);
}
Console.ReadKey();
}
}
Wie man hier sieht ist die Helperklasse verschwunden, die beiden identischen Aufrufe von
Console.WriteLine("==> "
+ e.Method.DeclaringType.Name
+ "."
+ e.Method.Name);
könnte man natürlich auch wieder in einer Funktion zusammenfassen,
Wenn man natürlich das Attribut an sich betrachtet:
z.B. den Konstruktor von
public StringFormatAttribute(String strPattern)
{
Helper.SayHuhu();
_strPattern = strPattern;
}
ist das sicherlich richtig, denn im Attribut geht das zumindest so weit ich weiss nicht, und genau so wenn Helper.SayHuhu() nach der ersten Codezeile in einer Funktion ausserhalb eines Attributes stehen sollte, oder vor der letzten Codezeile ausserhalb eines Attributes...
aber ansonsten denke ich es wird nicht mehr benötigt, oder?
Außerdem kann man ja, wie man sieht über MethodExecutionEventArgs die entsprechenden Parameter im Attribut auslesen und ausgeben.