通过


TypeAttributes 枚举

定义

指定类型属性。

此枚举支持其成员值的按位组合。

public enum class TypeAttributes
[System.Flags]
public enum TypeAttributes
[System.Flags]
[System.Serializable]
public enum TypeAttributes
[System.Flags]
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public enum TypeAttributes
[<System.Flags>]
type TypeAttributes = 
[<System.Flags>]
[<System.Serializable>]
type TypeAttributes = 
[<System.Flags>]
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type TypeAttributes = 
Public Enum TypeAttributes
继承
TypeAttributes
属性

字段

名称 说明
AnsiClass 0

LPTSTR 被解释为 ANSI。

AutoLayout 0

指定由公共语言运行时自动布局类字段。

Class 0

指定类型为类。

NotPublic 0

指定该类不是公共类。

Public 1

指定该类为公共类。

NestedPublic 2

指定该类嵌套有公共可见性。

NestedPrivate 3

指定该类嵌套有私有可见性。

NestedFamily 4

指定类嵌套有系列可见性,因此只能通过其自己的类型和任何派生类型内的方法进行访问。

NestedAssembly 5

指定类嵌套有程序集可见性,因此只能通过程序集内的方法进行访问。

NestedFamANDAssem 6

指定类嵌套有程序集和家庭可见性,因此只能通过位于其系列和程序集交集的方法访问。

NestedFamORAssem 7

指定类嵌套有系列或程序集可见性,因此只能通过位于其系列和程序集的并集中的方法访问。

VisibilityMask 7

指定类型可见性信息。

SequentialLayout 8

指定按向元数据发出字段的顺序按顺序排列类字段。

ExplicitLayout 16

指定在指定偏移量处布局类字段。

ExtendedLayout 24
LayoutMask 24

指定类布局信息。

ClassSemanticsMask 32

指定类语义信息;当前类是上下文的(否则是敏捷的)。

Interface 32

指定类型为接口。

Abstract 128

指定类型为抽象类型。

Sealed 256

指定类是具体类,不能扩展。

SpecialName 1024

指定类以名称表示的方式特殊。

RTSpecialName 2048

运行时应检查名称编码。

Import 4096

指定从另一个模块导入类或接口。

Serializable 8192

指定可以序列化类。

WindowsRuntime 16384

指定 Windows 运行时类型。

UnicodeClass 65536

LPTSTR 被解释为 UNICODE。

AutoClass 131072

LPTSTR 会自动解释。

CustomFormatClass 196608

LPSTR 由一些特定于实现的方法进行解释,其中包括引发 a NotSupportedException的可能性。 在 .NET Framework 的Microsoft实现中不使用。

StringFormatMask 196608

用于检索用于本机互操作性的字符串信息。

HasSecurity 262144

类型具有与之关联的安全关联。

ReservedMask 264192

为运行时使用保留的属性。

BeforeFieldInit 1048576

指定调用类型的静态方法不会强制系统初始化类型。

CustomFormatMask 12582912

用于检索本机互操作的非标准编码信息。 未指定这 2 位的值的含义。 在 .NET Framework 的Microsoft实现中不使用。

示例

以下示例检索 Attributes 表示多种不同类型的对象的属性值 Type ,然后确定是否已设置各个属性标志。

using System;
using System.Reflection;

internal struct S
{
    public int X;
}

public abstract class Example
{
    protected sealed class NestedClass {}

    public interface INested {}

    public static void Main()
    {
        // Create an array of types.
        Type[] types = { typeof(Example), typeof(NestedClass),
                         typeof(INested), typeof(S) };

        foreach (var t in types) 
        {
           Console.WriteLine("Attributes for type {0}:", t.Name);

           TypeAttributes attr = t.Attributes;

           // To test for visibility attributes, you must use the visibility mask.
           TypeAttributes visibility = attr & TypeAttributes.VisibilityMask;
           switch (visibility)
           {
               case TypeAttributes.NotPublic:
                   Console.WriteLine("   ...is not public");
                   break;
               case TypeAttributes.Public:
                   Console.WriteLine("   ...is public");
                   break;
               case TypeAttributes.NestedPublic:
                   Console.WriteLine("   ...is nested and public");
                   break;
               case TypeAttributes.NestedPrivate:
                   Console.WriteLine("   ...is nested and private");
                   break;
               case TypeAttributes.NestedFamANDAssem:
                   Console.WriteLine("   ...is nested, and inheritable only within the assembly" +
                      "\n         (cannot be declared in C#)");
                   break;
               case TypeAttributes.NestedAssembly:
                   Console.WriteLine("   ...is nested and internal");
                   break;
               case TypeAttributes.NestedFamily:
                   Console.WriteLine("   ...is nested and protected");
                   break;
               case TypeAttributes.NestedFamORAssem:
                   Console.WriteLine("   ...is nested and protected internal");
                   break;
           }

           // Use the layout mask to test for layout attributes.
           TypeAttributes layout = attr & TypeAttributes.LayoutMask;
           switch (layout)
           {
               case TypeAttributes.AutoLayout:
                   Console.WriteLine("   ...is AutoLayout");
                   break;
               case TypeAttributes.SequentialLayout:
                   Console.WriteLine("   ...is SequentialLayout");
                   break;
               case TypeAttributes.ExplicitLayout:
                   Console.WriteLine("   ...is ExplicitLayout");
                   break;
           }

           // Use the class semantics mask to test for class semantics attributes.
           TypeAttributes classSemantics = attr & TypeAttributes.ClassSemanticsMask;
           switch (classSemantics)
           {
               case TypeAttributes.Class:
                   if (t.IsValueType)
                   {
                       Console.WriteLine("   ...is a value type");
                   }
                   else
                   {
                       Console.WriteLine("   ...is a class");
                   }
                   break;
               case TypeAttributes.Interface:
                   Console.WriteLine("   ...is an interface");
                   break;
           }

           if ((attr & TypeAttributes.Abstract) != 0)
           {
               Console.WriteLine("   ...is abstract");
           }

           if ((attr & TypeAttributes.Sealed) != 0)
           {
               Console.WriteLine("   ...is sealed");
           }
           
           Console.WriteLine();
       }
    }
}
// The example displays the following output:
// Attributes for type Example:
//    ...is public
//    ...is AutoLayout
//    ...is a class
//    ...is abstract

// Attributes for type NestedClass:
//    ...is nested and protected
//    ...is AutoLayout
//    ...is a class
//    ...is sealed

// Attributes for type INested:
//    ...is nested and public
//    ...is AutoLayout
//    ...is an interface
//    ...is abstract

// Attributes for type S:
//    ...is not public
//    ...is SequentialLayout
//    ...is a value type
//    ...is sealed
Imports System.Reflection

Friend Structure S
    Public X As Integer
End Structure

Public MustInherit Class Example
    Protected NotInheritable Class NestedClass
    End Class

    Public Interface INested
    End Interface

    Public Shared Sub Main()
        ' Create an array of types.
        Dim types() As Type = { GetType(Example), GetType(NestedClass),
                                GetType(INested), GetType(S) }

        For Each t In types
           Console.WriteLine("Attributes for type {0}:", t.Name)

           Dim attr As TypeAttributes = t.Attributes

           ' Use the visibility mask to test for visibility attributes.
           Dim visibility As TypeAttributes = attr And TypeAttributes.VisibilityMask
           Select Case visibility
               Case TypeAttributes.NotPublic:
                   Console.WriteLine("   ...is not Public")
               Case TypeAttributes.Public:
                   Console.WriteLine("   ...is Public")
               Case TypeAttributes.NestedPublic:
                   Console.WriteLine("   ...is nested and Public")
               Case TypeAttributes.NestedPrivate:
                   Console.WriteLine("   ...is nested and Private")
               Case TypeAttributes.NestedFamANDAssem:
                   Console.WriteLine("   ...is nested, and inheritable only within the assembly" & _
                      vbLf & "         (cannot be declared in Visual Basic)")
               Case TypeAttributes.NestedAssembly:
                   Console.WriteLine("   ...is nested and Friend")
               Case TypeAttributes.NestedFamily:
                   Console.WriteLine("   ...is nested and Protected")
               Case TypeAttributes.NestedFamORAssem:
                   Console.WriteLine("   ...is nested and Protected Friend")
           End Select

           ' Use the layout mask to test for layout attributes.
           Dim layout As TypeAttributes = attr And TypeAttributes.LayoutMask
           Select Case layout
               Case TypeAttributes.AutoLayout:
                   Console.WriteLine("   ...is AutoLayout")
               Case TypeAttributes.SequentialLayout:
                   Console.WriteLine("   ...is SequentialLayout")
               Case TypeAttributes.ExplicitLayout:
                   Console.WriteLine("   ...is ExplicitLayout")
           End Select

           ' Use the class semantics mask to test for class semantics attributes.
           Dim classSemantics As TypeAttributes = attr And TypeAttributes.ClassSemanticsMask
           Select Case classSemantics
               Case TypeAttributes.Class:
                   If t.IsValueType Then
                       Console.WriteLine("   ...is a value type")
                   Else
                       Console.WriteLine("   ...is a class")
                   End If
               Case TypeAttributes.Interface:
                   Console.WriteLine("   ...is an interface")
           End Select

           If 0 <> (attr And TypeAttributes.Abstract) Then _
               Console.WriteLine("   ...is MustInherit")

           If 0 <> (attr And TypeAttributes.Sealed) Then _
               Console.WriteLine("   ...is NotInheritable")
           Console.WriteLine()
       Next
    End Sub
End Class
' The example displays the following output:
'       Attributes for type Example:
'          ...is Public
'          ...is AutoLayout
'          ...is a class
'          ...is MustInherit
'
'       Attributes for type NestedClass:
'          ...is nested and Protected
'          ...is AutoLayout
'          ...is a class
'          ...is NotInheritable
'
'       Attributes for type INested:
'          ...is nested and Public
'          ...is AutoLayout
'          ...is an interface
'          ...is MustInherit
'
'       Attributes for type S:
'          ...is not Public
'          ...is SequentialLayout
'          ...is a value type
'          ...is NotInheritable

注解

枚举的 TypeAttributes 一些成员是表示一组互斥属性的掩码。 例如,该VisibilityMask成员包括 NotPublic、、PublicNestedPrivateNestedFamilyNestedPublicNestedAssemblyNestedFamANDAssemNestedFamORAssem成员。 由于每个属性集都包含一个基础值为零的成员,因此应首先And使用从属性(例如Type.Attributes)检索到的特定System.Reflection.TypeAttributes值的掩码值。 下表列出了掩码及其包含的各个成员:

Mask 所含内容
VisibilityMask NotPublic
公共
NestedPublic
NestedPrivate
NestedFamily
NestedAssembly
NestedFamANDAssem
NestedFamORAssem
LayoutMask AutoLayout
SequentialLayout
ExplicitLayout
ClassSemanticsMask
接口
StringFormatMask AnsiClass
UnicodeClass
AutoClass
CustomFormatClass
CustomFormatMask 无成员。

此枚举器类的成员与 corhdr.h 文件中定义的 CorTypeAttr 枚举器匹配。

适用于