Feedback

C# - Eingabevalidierung mit PostSharp Aspekt und Regex

Veröffentlicht von am 5/13/2008
(1 Bewertungen)
Ein OnMethodBoundaryAspect Aspekt aus PostSharp Laos um ein eine Eigenschaft mit einer Regular Expression zu validieren.

Dem Property das geprüft werden soll, wird der Aspekt RegexValidatorAspekt vorangestellt.

Zusätzlich muss noch PostSharp.Laos und PostSharp.Public referenziert werden.
using System;
using System.Collections.Generic;
using System.Text;
using PostSharp.Laos;
using System.Text.RegularExpressions;

namespace PostSharpTest
{
	/// <summary>
	/// Überprüft die Eingabe einer Eigenschaft mit einem Regulären Ausdruck.
	/// </summary>
	/// <remarks>Mit dem Named Property <see cref="math"/> kann eingestellt werden ob eine Exception
	/// geworfen wernden soll, wenn keine Übereinstimmung vorliegt (match=false) oder die Ausführung
	/// des Codes normal weitergeht (match=true)</remarks>
	/// <example>
	/// using System;
	/// using System.Collections.Generic;
	/// using System.Text;
	/// 
	/// namespace PostSharpTest
	/// {
	///		class Program
	///		{
	///			static void Main(string[] args)
	///			{
	///				try
	///				{
	///					MyInputClass myClass = new MyInputClass();
	///					myClass.ValidatedProp = "20";	//gültige Eingabe
	///					myClass.ValidatedProp = "e20"; //ungültige Eingabe - InvalidInputException
	///					myClass.ValidatedProp = "20.0"; //ungültige Eingabe - InvalidInputException
	///				}
	///				catch (System.ArgumentException e)
	///				{
	///					Console.WriteLine(e.Message);
	///				}
	///			}
	///		}
	///	
	///		class MyInputClass
	///		{
	///			private string myField;
	/// 
	///			[RegexValidatorAspekt("[^0-9]", match = true)]
	///			public string ValidatedProp
	///			{
	///				get { return myField; }
	///				set { myField = value; }
	///			}
	///		}
	/// }
	/// </example>
	/// <author>Rainer Schuster</author>
	[Serializable]
	[AttributeUsage(AttributeTargets.Property)]
	public class RegexValidatorAspekt: OnMethodBoundaryAspect
	{		
		private Regex pattern;
		public bool match = true;

		public RegexValidatorAspekt(string excludingRegEx)
		{
			pattern = new Regex(excludingRegEx, RegexOptions.Compiled);
			
		}

		public override void OnEntry(MethodExecutionEventArgs eventArgs)
		{
			object[] objArgs = eventArgs.GetArguments();
			
			//Entweder kam eine NullReference, 
			//oder wir sind im getter des Property
			if( objArgs != null)
			{	
				//... und da gibt es nur einen Parameter.
				string value = objArgs[0].ToString();
				if( pattern.IsMatch( value ) == match)
				{
					string message = string.Format("Invalid value:{0} for pattern {1}", value, pattern.ToString());
					throw new ArgumentException( message);
				}
			}
		}
	}
}

Abgelegt unter PostSharp, PostSharp Laos, Aspekt, AOP, Regex.

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!