/// <summary>
 /// Returns the interface to be exposed.
 /// </summary>
 /// <param name="containerType">Type of the object in which our instance will be composed.
 /// This is not relevant for our purpose.</param>
 /// <returns>The content of the <see cref="InterfaceType"/> property.</returns>
 protected override Type[] GetPublicInterfaces(Type containerType)
 {
     return(new [] { GenericArg.Map(this.InterfaceType, containerType.GetGenericArguments(), null) });
 }
 /// <summary>
 /// Creates the composed object.
 /// </summary>
 /// <param name="eventArgs">Event arguments.</param>
 /// <returns>A new instance of the type specified in the <see cref="ImplementationType"/> property.</returns>
 public override object CreateImplementationObject(AdviceArgs eventArgs)
 {
     return
         (Activator.CreateInstance(
              GenericArg.Map(this.ImplementationType, eventArgs.Instance.GetType().GetGenericArguments(), null)));
 }