public virtual void CompileTimeValidate(INamedMetadataDeclaration metadata, Type typeValidated, IMessageSink messages)
        {
            // Usually I don't throw exceptions in aspect methods that are active at compile-time, but this takes the cake...
            if (null == messages)
                throw new ArgumentNullException("messages", Strings.ValidationNullMessageSink);

            if (!ValidateNonNullMetadata(metadata, messages))
                return;

            if (!ValidateExceptionType(messages))
                return;

            if (!ValidateInitializableExceptionType(messages))
                return;

            messages.Write(
                new Message(MessageLocation.Of(metadata),
                            SeverityType.Verbose,
                            Strings.ValidationAspectPassedValidationMessageId,
                            String.Format(CultureInfo.InvariantCulture,
                                          Strings.ValidationAspectPassedValidationMessageFormat,
                                          metadata.Name),
                            String.Empty,
                            Assembly.GetCallingAssembly().FullName,
                            null));
        }
            public override string GetName(INamedMetadataDeclaration declaration, ReflectionNameOptions options)
            {
                // Suppress the "System" namespace.
                int lastDot = declaration.Name.LastIndexOf('.');

                if (lastDot > 0 && declaration.Name.Substring(0, lastDot) == "System")
                {
                    return(declaration.Name.Substring(lastDot + 1));
                }

                return(base.GetName(declaration, options));
            }
        public override void CompileTimeValidate(INamedMetadataDeclaration metadata, Type typeValidated, IMessageSink messages)
        {
            base.CompileTimeValidate(metadata, typeValidated, messages);

            if (typeValidated.IsValueType && null == Nullable.GetUnderlyingType(typeValidated))
            {
                messages.Write(
                    new Message(MessageLocation.Of(metadata),
                                SeverityType.Error,
                                Strings.ErrorNotNullNonNullableMessageId,
                                String.Format(CultureInfo.InvariantCulture,
                                              Strings.ErrorNotNullNonNullableMessageFormat,
                                              typeValidated.Name),
                                String.Empty,
                                Assembly.GetCallingAssembly().FullName,
                                null));
            }
        }
        public override void CompileTimeValidate(INamedMetadataDeclaration metadata, Type typeValidated, IMessageSink messages)
        {
            base.CompileTimeValidate(metadata, typeValidated, messages);

            MethodName = metadata.ParentMember.Name;
        }
            public override string GetName( INamedMetadataDeclaration declaration, ReflectionNameOptions options )
            {
                // Suppress the "System" namespace.
                int lastDot = declaration.Name.LastIndexOf( '.' );
                if ( lastDot > 0 && declaration.Name.Substring( 0, lastDot ) == "System" )
                    return declaration.Name.Substring( lastDot + 1 );

                return base.GetName( declaration, options );
            }
        /// <summary>
        /// Validates that the provided metadata is not null.
        /// </summary>
        /// <param name="metadata">The metadata to do a null check on.</param>
        /// <param name="messages">An <see cref="IMessageSink"/> instance, used to write messages.</param>
        /// <returns>True if <c>metadata</c> is not null; otherwise, false.</returns>
        private static bool ValidateNonNullMetadata(INamedMetadataDeclaration metadata, IMessageSink messages)
        {
            bool isNotNull = null != metadata;

            if (!isNotNull)
            {
                messages.Write(
                    new Message(MessageLocation.Of(metadata),
                                SeverityType.Fatal,
                                Strings.ErrorNullMetadataMessageId,
                                Strings.ErrorNullMetadataMessage,
                                String.Empty,
                                Assembly.GetCallingAssembly().FullName,
                                null));
            }

            return isNotNull;
        }