File: System\ComponentModel\ToolboxItemAttribute.cs
Web Access
Project: src\src\libraries\System.ComponentModel.TypeConverter\src\System.ComponentModel.TypeConverter.csproj (System.ComponentModel.TypeConverter)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.ComponentModel.Design;
using System.Diagnostics.CodeAnalysis;
 
namespace System.ComponentModel
{
    /// <summary>
    /// Specifies attributes for a toolbox item.
    /// </summary>
    [AttributeUsage(AttributeTargets.All)]
    public class ToolboxItemAttribute : Attribute
    {
        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
        private Type? _toolboxItemType;
        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
        private readonly string? _toolboxItemTypeName;
 
        private const string DefaultToolboxItemTypeName = "System.Drawing.Design.ToolboxItem, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a";
 
        /// <summary>
        /// Initializes a new instance of ToolboxItemAttribute and sets the type to
        /// </summary>
        public static readonly ToolboxItemAttribute Default = new ToolboxItemAttribute(DefaultToolboxItemTypeName);
 
        /// <summary>
        /// Initializes a new instance of ToolboxItemAttribute and sets the type to
        /// <see langword='null'/>.
        /// </summary>
        public static readonly ToolboxItemAttribute None = new ToolboxItemAttribute(false);
 
        /// <summary>
        /// Gets whether the attribute is the default attribute.
        /// </summary>
        public override bool IsDefaultAttribute() => _toolboxItemTypeName == DefaultToolboxItemTypeName;
 
        /// <summary>
        /// Initializes a new instance of ToolboxItemAttribute and specifies if default values should be used.
        /// </summary>
        public ToolboxItemAttribute(bool defaultType)
        {
            if (defaultType)
            {
                if (!IDesignerHost.IsSupported)
                {
                    throw new NotSupportedException(SR.IDesignerHostNotSupported);
                }
 
                _toolboxItemTypeName = DefaultToolboxItemTypeName;
            }
        }
 
        /// <summary>
        /// Initializes a new instance of ToolboxItemAttribute and specifies the name of the type.
        /// </summary>
        public ToolboxItemAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] string toolboxItemTypeName)
        {
            ArgumentNullException.ThrowIfNull(toolboxItemTypeName);
 
            _toolboxItemTypeName = toolboxItemTypeName;
        }
 
        /// <summary>
        /// Initializes a new instance of ToolboxItemAttribute and specifies the type of the toolbox item.
        /// </summary>
        public ToolboxItemAttribute([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type toolboxItemType)
        {
            ArgumentNullException.ThrowIfNull(toolboxItemType);
 
            _toolboxItemType = toolboxItemType;
            _toolboxItemTypeName = toolboxItemType.AssemblyQualifiedName;
        }
 
        /// <summary>
        /// Gets the toolbox item's type.
        /// </summary>
        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
        public Type? ToolboxItemType
        {
            get
            {
                if (_toolboxItemType == null)
                {
                    if (_toolboxItemTypeName != null)
                    {
                        try
                        {
                            _toolboxItemType = Type.GetType(_toolboxItemTypeName, true);
                        }
                        catch (Exception ex)
                        {
                            throw new ArgumentException(SR.Format(SR.ToolboxItemAttributeFailedGetType, _toolboxItemTypeName), ex);
                        }
                    }
                }
                return _toolboxItemType;
            }
        }
 
        [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
        public string ToolboxItemTypeName => _toolboxItemTypeName ?? string.Empty;
 
        public override bool Equals([NotNullWhen(true)] object? obj)
        {
            if (obj == this)
            {
                return true;
            }
 
            return (obj is ToolboxItemAttribute other) && (other.ToolboxItemTypeName == ToolboxItemTypeName);
        }
 
        public override int GetHashCode()
        {
            if (_toolboxItemTypeName != null)
            {
                return _toolboxItemTypeName.GetHashCode();
            }
            return base.GetHashCode();
        }
    }
}