public SD_Type_Reflected(Type type)
    {
        reflectedType = type;
        modifiers     = type.IsNested ?
                        (type.IsNestedPublic ? Modifiers.Public :
                         type.IsNestedFamORAssem ? Modifiers.Internal | Modifiers.Protected :
                         type.IsNestedAssembly ? Modifiers.Internal :
                         type.IsNestedFamily ? Modifiers.Protected :
                         Modifiers.Private)
            :
                        (type.IsPublic ? Modifiers.Public :
                         !type.IsVisible ? Modifiers.Internal :
                         Modifiers.Private);
        if (type.IsAbstract && type.IsSealed)
        {
            modifiers |= Modifiers.Static;
        }
        else if (type.IsAbstract)
        {
            modifiers |= Modifiers.Abstract;
        }
        else if (type.IsSealed)
        {
            modifiers |= Modifiers.Sealed;
        }
        accessLevel = AccessLevelFromModifiers(modifiers);

        var assemblyDefinition = SD_Assembly.FromAssembly(type.Assembly);

        var generic = type.Name.IndexOf('`');

        name         = generic < 0 ? type.Name : type.Name.Substring(0, generic);
        name         = name.Replace("[*]", "[]");
        parentSymbol = string.IsNullOrEmpty(type.Namespace) ? assemblyDefinition.GlobalNamespace : assemblyDefinition.FindNamespace(type.Namespace);
        if (type.IsInterface)
        {
            kind = SymbolKind.Interface;
        }
        else if (type.IsEnum)
        {
            kind = SymbolKind.Enum;
        }
        else if (type.IsValueType)
        {
            kind = SymbolKind.Struct;
        }
        else if (type.IsClass)
        {
            kind = SymbolKind.Class;
            if (type.BaseType == typeof(System.MulticastDelegate))
            {
                kind = SymbolKind.Delegate;
            }
        }
        else
        {
            kind = SymbolKind.None;
        }

        if (type.IsGenericTypeDefinition)
        {
            var gtd            = type.GetGenericTypeDefinition() ?? type;
            var tp             = gtd.GetGenericArguments();
            var numGenericArgs = tp.Length;
            var declaringType  = gtd.DeclaringType;
            if (declaringType != null && declaringType.IsGenericType)
            {
                var parentArgs = declaringType.GetGenericArguments();
                numGenericArgs -= parentArgs.Length;
            }

            if (numGenericArgs > 0)
            {
                typeParameters = new List <SD_Type_Parameter>(numGenericArgs);
                for (var i = tp.Length - numGenericArgs; i < tp.Length; ++i)
                {
                    var tpDef = new SD_Type_Parameter {
                        kind = SymbolKind.TypeParameter, name = tp[i].Name, parentSymbol = this
                    };
                    typeParameters.Add(tpDef);
                }
            }
        }

        if (type.BaseType != null)
        {
            baseType = ReflectedTypeReference.ForType(type.BaseType ?? typeof(object));
        }

        interfaces = new List <SymbolReference>();
        var implements = type.GetInterfaces();

        for (var i = 0; i < implements.Length; ++i)
        {
            interfaces.Add(ReflectedTypeReference.ForType(implements[i]));
        }

        if (IsStatic && NumTypeParameters == 0 && !type.IsNested)
        {
            var attributes = System.Attribute.GetCustomAttributes(type);
            foreach (var attribute in attributes)
            {
                if (attribute is System.Runtime.CompilerServices.ExtensionAttribute)
                {
                    ReflectAllMembers(BindingFlags.Public | BindingFlags.NonPublic);
                    break;
                }
            }
        }
    }