参考:
http://www.cnblogs.com/artech/archive/2008/01/31/1059492.html
http://www.cnblogs.com/artech/archive/2008/02/19/1073033.html
匿名委托(lambada):
http://www.cnblogs.com/yjmyzz/archive/2009/03/13/1410924.html

// Microsoft.Practices.Unity.Interception.dll
// 调用起点
public class InterceptingRealProxy : RealProxy, IRemotingTypeInfo, IInterceptingProxy
{
...................................................
public override IMessage Invoke(IMessage msg)
{
Guard.ArgumentNotNull(msg, " msg " );
IMethodCallMessage callMessage = (IMethodCallMessage) msg;
if (callMessage.MethodBase.DeclaringType == typeof (IInterceptingProxy))
{
return this .HandleInterceptingProxyMethod(callMessage);
}
TransparentProxyMethodInvocation invocation = new TransparentProxyMethodInvocation(callMessage, this .target);
return ((TransparentProxyMethodReturn) this .interceptorsPipeline.Invoke(invocation,
delegate (IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
if (callMessage.MethodBase.DeclaringType.IsAssignableFrom( this .target.GetType()))
{
try
{
object returnValue = callMessage.MethodBase.Invoke( this .target, invocation.Arguments);
return input.CreateMethodReturn(returnValue, invocation.Arguments);
}
catch (TargetInvocationException exception)
{
return input.CreateExceptionMethodReturn(exception.InnerException);
}
}
return input.CreateExceptionMethodReturn( new InvalidOperationException(Resources.ExceptionAdditionalInterfaceNotImplemented));
})).ToMethodReturnMessage();
}
............................................
}
////////////////////////////// /
/// 行为管线
public class InterceptionBehaviorPipeline
{
.............
public IMethodReturn Invoke(IMethodInvocation input, InvokeInterceptionBehaviorDelegate target)
{
if ( this .interceptionBehaviors.Count == 0 )
{
return target(input, null );
}
int interceptorIndex = 0 ;
return this .interceptionBehaviors[ 0 ].Invoke(input, delegate {
interceptorIndex ++ ;
if (interceptorIndex < this .interceptionBehaviors.Count)
{
IInterceptionBehavior local1 = this .interceptionBehaviors[interceptorIndex];
return new InvokeInterceptionBehaviorDelegate(local1.Invoke);
}
return target;
});
}
..............
}
///////////////////////////
/// 一个具体的CallHander
public class OrderValidationCallHandler : ICallHandler
{
................
public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
{
if (input.Inputs.Count == 0 ){ return getNext()(input, getNext);}
Order order = input.Inputs[ 0 ] as Order;
if (order == null ){ return getNext()(input, getNext);}
................
if ( this .ValidateTotalPrice)
{
double totalPrice = 0 ;
foreach (OrderItem item in order.Items)
{
totalPrice += item.Quantity * item.UnitPrice;
}
if (totalPrice != order.TotalPrice)
{
return input.CreateExceptionMethodReturn( new OrderValidationException( " The sum of the order item is not equal to the order total price! " ));
}
}
return getNext()(input, getNext);
}
................
}
///测试

namespace PIAPTEST
{
public delegate IMethodReturn InvokeInterceptionBehaviorDelegate(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext);
public delegate InvokeInterceptionBehaviorDelegate GetNextInterceptionBehaviorDelegate();
public class IMethodReturn
{
public object ReturnValue { get ; set ; }
}
public class IMethodInvocation
{
public MethodBase MethodBase { get ; set ; }
public object Target { get ; set ; }
}
public interface IInterceptionBehavior
{
IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext);
}
#region 一些实现
public class BehaviorA : IInterceptionBehavior
{
public string Id { get ; set ; }
public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
{
Out.Write( " Behavior: " + Id + " ->Invoke Befor! " );
var r = getNext()(input, getNext);
Out.Write( " Behavior: " + Id + " -> invoke After! " );
return r;
}
}
#endregion
public class InterceptionBehaviorPipeline
{
public readonly List < IInterceptionBehavior > interceptionBehaviors;
// Properties
public int Count
{
get
{
return this .interceptionBehaviors.Count;
}
}
// Methods
public InterceptionBehaviorPipeline()
{
this .interceptionBehaviors = new List < IInterceptionBehavior > ();
}
public IMethodReturn Invoke(IMethodInvocation input, InvokeInterceptionBehaviorDelegate target)
{
if ( this .interceptionBehaviors.Count == 0 )
{
return target(input, null );
}
int interceptorIndex = 0 ;
return this .interceptionBehaviors[ 0 ].Invoke(input, delegate
{
interceptorIndex ++ ;
if (interceptorIndex < this .interceptionBehaviors.Count)
{
IInterceptionBehavior local1 = this .interceptionBehaviors[interceptorIndex];
return new InvokeInterceptionBehaviorDelegate(local1.Invoke);
}
return target;
});
}
}
public class InterceptionRealProxy
{
public InterceptionBehaviorPipeline Pipeline = new InterceptionBehaviorPipeline();
public object Invoke(BLLObj targetObj, string methodName, object [] args )
{
IMethodInvocation invocation = new IMethodInvocation();
invocation.MethodBase = targetObj.GetType().GetMethod(methodName);
invocation.Target = targetObj;
return Pipeline.Invoke(invocation, delegate (IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) {
Out.Write( " 实际对象被调用! " );
return new IMethodReturn() {
ReturnValue = invocation.MethodBase.Invoke(targetObj, args)
};
});
}
}
public class Out
{
public static void Write( string msg)
{
HttpContext.Current.Response.Write(msg + "
" );
}
}
public class BLLObj
{
public int Add( int a, int b)
{
return a + b;
}
}
}

private void TestPIAP()
{
var t = new InterceptionRealProxy();
t.Pipeline.interceptionBehaviors.Add( new BehaviorA { Id = " 1号 " });
t.Pipeline.interceptionBehaviors.Add( new BehaviorA { Id = " 2号 " });
t.Pipeline.interceptionBehaviors.Add( new BehaviorA { Id = " 3号 " });
t.Pipeline.interceptionBehaviors.Add( new BehaviorA { Id = " 4号 " });
t.Invoke( new BLLObj(), " Add " , new object []{ 1 , 3 });
}
//输出结果
Behavior:1号->Invoke Befor!
Behavior:2号->Invoke Befor!
Behavior:3号->Invoke Befor!
Behavior:4号->Invoke Befor!
实际对象被调用!
Behavior:4号-> invoke After!
Behavior:3号-> invoke After!
Behavior:2号-> invoke After!
Behavior:1号-> invoke After!