File: cdf\src\NetFx40\Tools\System.Activities.Presentation\System\Activities\Presentation\Base\Core\Metadata\AttributeTable.cs
Project: ndp\System.Data.csproj (System.Data)
//----------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//----------------------------------------------------------------
namespace System.Activities.Presentation.Metadata 
{
 
    using System.Activities.Presentation.Internal.Metadata;
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Reflection;
    using System.Windows;
    using System.Runtime;
    using System.Activities.Presentation;
 
    // <summary>
    // Attribute tables are essentially read-only dictionaries, but the keys
    // and values are computed separately.  It is very efficient to ask an
    // attribute table if it contains attributes for a particular type.
    // The actual set of attributes is demand created.
    // </summary>
    [Fx.Tag.XamlVisible(false)]
    public sealed class AttributeTable 
    {
 
        private MutableAttributeTable _attributes;
 
        //
        // Creates a new attribute table given dictionary information
        // from the attribute table builder.
        //
        internal AttributeTable(MutableAttributeTable attributes) 
        {
            Fx.Assert(attributes != null, "attributes parameter should not be null");
            _attributes = attributes;
        }
 
        // <summary>
        // Returns an enumeration of all types that have attribute overrides
        // of some kind (on a property, on the type itself, etc).  This can be
        // used to determine what types will be refreshed when this attribute
        // table is added to the metadata store.
        // </summary>
        // <returns></returns>
        public IEnumerable<Type> AttributedTypes 
        {
            get { return _attributes.AttributedTypes; }
        }
 
        //
        // Returns our internal mutable table.  This is used
        // by AttributeTableBuilder's AddTable method.
        //
        internal MutableAttributeTable MutableTable 
        {
            get { return _attributes; }
        }
 
        // <summary>
        // Returns true if this table contains any metadata for the given type.
        // The metadata may be class-level metadata or metadata associated with
        // a DepenendencyProperty or MemberDescriptor.  The AttributeStore uses
        // this method to identify loaded types that need a Refresh event raised
        // when a new attribute table is added, and to quickly decide which
        // tables should be further queried during attribute queries.
        // </summary>
        // <param name="type">The type to check.</param>
        // <returns>true if the table contains attributes for the given type.</returns>
        // <exception cref="ArgumentNullException">if type is null</exception>
        public bool ContainsAttributes(Type type) 
        {
            if (type == null) 
            {
                throw FxTrace.Exception.ArgumentNull("type");
            }
            return _attributes.ContainsAttributes(type);
        }
 
        // <summary>
        // Returns an enumeration of all attributes provided for the
        // given argument.  This will never return a null enumeration.
        // </summary>
        // <param name="type">The type to get class-level attributes for.</param>
        // <returns>An enumeration of attributes.</returns>
        // <exception cref="ArgumentNullException">if type is null</exception>
        public IEnumerable GetCustomAttributes(Type type) 
        {
            if (type == null) 
            {
                throw FxTrace.Exception.ArgumentNull("type");
            }
            return _attributes.GetCustomAttributes(type);
        }
 
        // <summary>
        // Returns an enumeration of all attributes provided for the
        // given argument.  This will never return a null enumeration.
        // </summary>
        // <param name="ownerType">The type that declares this descriptor.</param>
        // <param name="descriptor">A member descriptor to get custom attributes for.</param>
        // <returns>An enumeration of attributes.</returns>
        // <exception cref="ArgumentNullException">if descriptor is null</exception>
        public IEnumerable GetCustomAttributes(Type ownerType, MemberDescriptor descriptor) 
        {
            if (ownerType == null) 
            {
                throw FxTrace.Exception.ArgumentNull("ownerType");
            }
            if (descriptor == null) 
            {
                throw FxTrace.Exception.ArgumentNull("descriptor");
            }
            return _attributes.GetCustomAttributes(ownerType, descriptor);
        }
 
        // <summary>
        // Returns an enumeration of all attributes provided for the
        // given argument.  This will never return a null enumeration.
        // </summary>
        // <param name="ownerType">The owner type of the dependency property.</param>
        // <param name="dp">A dependency property to get custom attributes for.</param>
        // <returns>An enumeration of attributes.</returns>
        // <exception cref="ArgumentNullException">if ownerType or dp is null</exception>
        public IEnumerable GetCustomAttributes(Type ownerType, DependencyProperty dp) 
        {
            if (ownerType == null) 
            {
                throw FxTrace.Exception.ArgumentNull("ownerType");
            }
            if (dp == null) 
            {
                throw FxTrace.Exception.ArgumentNull("dp");
            }
            return _attributes.GetCustomAttributes(ownerType, dp);
        }
 
        // <summary>
        // Returns an enumeration of all attributes provided for the
        // given argument.  This will never return a null enumeration.
        // </summary>
        // <param name="ownerType">The owner type of the dependency property.</param>
        // <param name="member">The member to provide attributes for.</param>
        // <returns>An enumeration of attributes.</returns>
        // <exception cref="ArgumentNullException">if ownerType or member is null</exception>
        public IEnumerable GetCustomAttributes(Type ownerType, MemberInfo member) 
        {
            if (ownerType == null) 
            {
                throw FxTrace.Exception.ArgumentNull("ownerType");
            }
            if (member == null) 
            {
                throw FxTrace.Exception.ArgumentNull("member");
            }
            return _attributes.GetCustomAttributes(ownerType, member);
        }
 
        // <summary>
        // Returns an enumeration of all attributes provided for the
        // given argument.  This will never return a null enumeration.
        // </summary>
        // <param name="ownerType">The owner type of the dependency property.</param>
        // <param name="memberName">The name of the member to provide attributes for.</param>
        // <returns>An enumeration of attributes.</returns>
        // <exception cref="ArgumentNullException">if ownerType or member is null</exception>
        public IEnumerable GetCustomAttributes(Type ownerType, string memberName) 
        {
            if (ownerType == null) 
            {
                throw FxTrace.Exception.ArgumentNull("ownerType");
            }
            if (memberName == null) 
            {
                throw FxTrace.Exception.ArgumentNull("memberName");
            }
            return _attributes.GetCustomAttributes(ownerType, memberName);
        }
 
        //
        // Called by the MetadataStore to walk through all the metadata and
        // ensure that it can be found on the appropriate types and members.
        // Any asserts that come from here are bugs in the type description
        // provider.
        //
        internal void DebugValidateProvider()
        {
#if DEBUG
            _attributes.DebugValidateProvider();
#else
#endif
        }
    }
}